Создание именованной трубы в драйвере-фильтре(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)

Ответы (0 шт):