Создание именованной трубы в драйвере-фильтре(minifilter)
Не получается в минифильтре создать именованную трубу с помощью FltCreateNamedPipe, все время функция возвращает (NTSTATUS)STATUS_INVALID_HANDLE т.е код 0xC0000008, пробовал разные имена, много чего перепробовал, если в objAttr.RootDirectory ничего не записать, то ошибка STATUS_OBJECT_PATH_SYNTAX_BAD Я создавал Handle и передавал указатель на него(так должно работать)
VOID createPipe(unsigned short name[], unsigned int constt) {
{
HANDLE pipeHande;
//FILE_OBJECT namedPipeObject; //Он является не обязательным для FltCreateNamedPipe
OBJECT_ATTRIBUTES objAttr;
UNICODE_STRING fullName;
IO_STATUS_BLOCK ioStat;
//IO_DRIVER_CREATE_CONTEXT my; //последний необязательный параметр
RtlInitUnicodeString(&fullName, name);//L"RamDrvOut");
InitializeObjectAttributes(&objAttr, &fullName, constt, NULL, NULL);
objAttr.RootDirectory = L"\\";
// \\\\??\\pipe\\ опробованно
// \\\\.\\pipe\\ опробованно
// \\ тоже, если RootDir не менять, то будет PATH_SYNTAX_BAD
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "\n\nPipe name => %wZ\n", fullName);
LARGE_INTEGER time; //= 10 * 1000 * 250; 2 500 000 = 26 25A0
time.QuadPart = 0x2625A0; //250мс
NTSTATUS createPipeStatus = FltCreateNamedPipeFile(
FilterHandle, //Filter
NULL, //Instance
&pipeHande, //FileHandle
NULL, //FileObject
GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, //DesiredAccess
&objAttr,
&ioStat,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_CREATE, //FILE_OPEN, FILE_OPEN IF
FILE_SYNCHRONOUS_IO_NONALERT,
FILE_PIPE_BYTE_STREAM_TYPE,
FILE_PIPE_BYTE_STREAM_MODE,
FILE_PIPE_COMPLETE_OPERATION,
3,
250,
250,
&time, //250мс
NULL); //&my
if (NT_SUCCESS(createPipeStatus)) {
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "STATUS SUCCESS\n");
}
else { //Для отладки
switch (createPipeStatus) {
case 0xC000000D: { DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, " STATUS_INVALID_PARAMETER\n"); break; }
case 0xC000003B: { DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, " STATUS_OBJECT_PATH_SYNTAX_BAD\n"); break; }
case 0xC0000033: { DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, " STATUS_OBJECT_NAME_INVALID\n"); break; }
case 0xC0000034: { DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, " STATUS_OBJECT_NAME_NOT_FOUND\n"); break; }
case 0xC0000008: { DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, " STATUS_INVALID_HANDLE\n"); break; }
default: {
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "Unknown Status => %x \n", createPipeStatus);
break;
}
}
}
}
}
createPipe(L'MyPipe', OBJ_KERNEL_HANDLE)