首页
社区
课程
招聘
[旧帖] [求助]用IoCreateFile在系统启动时创建内核管道,返回STATUS_OBJECT_PATH_NOT_FOUND 0.00雪花
发表于: 2012-1-4 14:34 2361

[旧帖] [求助]用IoCreateFile在系统启动时创建内核管道,返回STATUS_OBJECT_PATH_NOT_FOUND 0.00雪花

2012-1-4 14:34
2361
【求助】用IoCreateFile在系统启动时创建内核管道,返回STATUS_OBJECT_PATH_NOT_FOUND

奇怪的是,在系统启动以后,再创建管道是没有任何问题的,有人说是系统启动时,文件系统没有启动,

但是,我试过将驱动放到最后启动,问题依旧,求助了,

代码片段如下:

NTSTATUS  ZwCreateNamedPipeFile (
                           OUT PHANDLE FileHandle,
                           IN ULONG DesiredAccess,
                        IN POBJECT_ATTRIBUTES ObjectAttributes,
                        OUT PIO_STATUS_BLOCK IoStatusBlock,
                        IN ULONG ShareAccess,
                        IN ULONG CreateDisposition,
                        IN ULONG CreateOptions,
                        IN ULONG NamedPipeType,
                        IN ULONG ReadMode,
                        IN ULONG CompletionMode,
                        IN ULONG MaximumInstances,
                        IN ULONG InboundQuota,
                        IN ULONG OutboundQuota,
                        IN PLARGE_INTEGER DefaultTimeout OPTIONAL
                        )  
{   
        NAMED_PIPE_CREATE_PARAMETERS NamedPipeParms;
        NTSTATUS Status;
        __try   
        {   
                if ( DefaultTimeout )
                {
                           NamedPipeParms.TimeoutSpecified = TRUE;
                           NamedPipeParms.DefaultTimeout.QuadPart = DefaultTimeout->QuadPart;
                }
                else
                {   
                        NamedPipeParms.TimeoutSpecified = FALSE;
                }
                  
                NamedPipeParms.NamedPipeType = NamedPipeType;
                NamedPipeParms.ReadMode = ReadMode;
                NamedPipeParms.CompletionMode = CompletionMode;
                NamedPipeParms.MaximumInstances = MaximumInstances;
                NamedPipeParms.InboundQuota = InboundQuota;
                NamedPipeParms.OutboundQuota = OutboundQuota;
                Status = IoCreateFile (
                                           FileHandle,
                                        DesiredAccess,
                                        ObjectAttributes,
                                        IoStatusBlock,
                                        NULL,
                                        0,
                                        ShareAccess,
                                        CreateDisposition,
                                        CreateOptions,
                                        NULL,
                                        0,
                                        CreateFileTypeNamedPipe,
                                        &NamedPipeParms,
                                        0   
                                        );

                return Status;
        }   
        __except (EXCEPTION_EXECUTE_HANDLER)   
        {
           KdPrint (("NtCreateNamedPipeFile: Exception occured.\n"));
           return STATUS_UNSUCCESSFUL;   
        }
}  

NTSTATUS __stdcall ZwCreateNamedPipe(PCWSTR pwszPipeName,PHANDLE PhPipe)
{

        NTSTATUS ntStatus=STATUS_SUCCESS;
        HANDLE hPipe=NULL;
        UNICODE_STRING namedPipe={0};
        OBJECT_ATTRIBUTES ObjAttr={0};
        IO_STATUS_BLOCK ioStatusBlock={0};
        LARGE_INTEGER nTimeOut= {0};

        SECURITY_DESCRIPTOR  SecurityDescriptor = {0};
       
        RtlCreateSecurityDescriptor(&SecurityDescriptor,SECURITY_DESCRIPTOR_REVISION);
        RtlSetDaclSecurityDescriptor(&SecurityDescriptor, TRUE, (PACL) NULL, FALSE);
       
        RtlInitUnicodeString ( &namedPipe, pwszPipeName );
        InitializeObjectAttributes(&ObjAttr,&namedPipe,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,&SecurityDescriptor);

        nTimeOut.QuadPart = -1 * 10000 * 1000;// 1s

        //Create Named Pipe
        ntStatus = ZwCreateNamedPipeFile (
                        &hPipe,
                        FILE_ALL_ACCESS,//FILE_ANY_ACCESS  GENERIC_ALL  FILE_ALL_ACCESS
                        &ObjAttr,
                        &ioStatusBlock,
                        FILE_SHARE_READ | FILE_SHARE_WRITE,
                        FILE_CREATE,
                        0,
                        FILE_PIPE_BYTE_STREAM_TYPE,
                        FILE_PIPE_BYTE_STREAM_MODE,
                        FILE_PIPE_QUEUE_OPERATION,//FILE_PIPE_COMPLETE_OPERATION
                        1,
                        0,
                        0,
                        &nTimeOut
                        );

        if (NT_SUCCESS (ntStatus))
                *PhPipe = hPipe;
        else
                *PhPipe = NULL;

        return ntStatus;
}

const PCWSTR pwszPipeName = L"\\Device\\NamedPipe\\com_3";
status = ZwCreateNamedPipe(pwszPipeName,&deviceExtension->hPipe);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
2
试试注册一个BootDriverReinitialization回调,在回调中创建
IoRegisterBootDriverReinitialization()
2012-1-4 18:53
0
雪    币: 558
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢楼上,刚才试过了,的确可以

我是在IRP_MN_START_DEVICE里,调用IoRegisterDriverReinitialization注册一个回调
然后创建管道,这样就可以了,

我看了一下打印的时间,成功的调用和失败的之间,只相差了1.1秒

1.64...  ZwCreateNamedPipe failed,0xc000003a
2.76...  ZwCreateNamedPipe successful

不过看了一下驱动模块的加载顺序,提供管道服务的驱动Npfs.SYS是86,而我的驱动则在它的后面。所以,有点怀疑,是不是真的是"\\??\\pipe"不存在导致的
2012-1-5 12:35
0
游客
登录 | 注册 方可回帖
返回
//