【求助】用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直播授课