Создать именованный канал в минифильтре (режим ядра) - PullRequest
0 голосов
/ 20 февраля 2020

Я не могу создать именованный канал. Я пробовал разные комбинации, разные атрибуты, разные названия каналов. FltCreateNamedPipeFile всегда возвращает NTSTATUS INVALID_HANDLE. Я инициализирую OBJECT_ATTRIBUTES вручную, но пробовал InitializeObjectAttributes, это не помогло. Я не смог решить эту проблему в течение нескольких дней. Ps google translate)

VOID createPipe(unsigned short name[], unsigned int constt) {
    {
        HANDLE pipeHandle;
        OBJECT_ATTRIBUTES objAttr;
        UNICODE_STRING fullName; 
        IO_STATUS_BLOCK ioStat;

        RtlInitUnicodeString(&fullName, name);  

        UNICODE_STRING rootDir;
        RtlInitUnicodeString(&rootDir, L"\\\\??\\pipe\\");

        { 
            objAttr.RootDirectory = &rootDir; //L"\\Device\\NamedPipe\\mypipe\\"; //L"\\\\.\\pipe\\";
            objAttr.ObjectName = &fullName;
            objAttr.Length = sizeof(objAttr);
            objAttr.Attributes = constt;
            objAttr.SecurityDescriptor = NULL;
            objAttr.SecurityQualityOfService = NULL;
        }

        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "\n\nPipe name =>%wZ\n", fullName);


        LARGE_INTEGER time; //10 * 1000 * 250 = 250 ms
        time.QuadPart = 0x2625A0; 

        NTSTATUS createPipeStatus = FltCreateNamedPipeFile(
            FilterHandle,                                    //Filter
            NULL,                                            //Instance
            &pipeHandle,                                     //FileHandle
            NULL,                                            //FileObject
            FILE_WRITE_DATA | FILE_READ_DATA | SYNCHRONIZE,  //DesiredAccess
            &objAttr,                                        //OBJECT_ATTRIBUTES
            &ioStat,                                         //PIO_STATUS_BLOCK
            FILE_SHARE_READ | FILE_SHARE_WRITE,              //SHARE_ACCESS
            FILE_OPEN_IF,                                    //CreateDisposition FILE_OPEN, FILE_OPEN IF
            FILE_SYNCHRONOUS_IO_NONALERT,                    //CREATE OPTION
            FILE_PIPE_BYTE_STREAM_TYPE,                      //NAMED PIPE TYPE
            FILE_PIPE_BYTE_STREAM_MODE,                      //READ MODE
            FILE_PIPE_QUEUE_OPERATION,                       //COMPLETION MODE
            10,                                              //MAXIMUM INSTANCES
            250,                                             //INBOUND QUOTA
            250,                                             //OUTBOUND QUOTA
            &time, //250мс                                   //DEFAULT TIMEOUT
            NULL); //                                        //DRIVER_CONTEX

        if (NT_SUCCESS(createPipeStatus)) {
            DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "STATUS SUCCESS\n");
        }
        else {
            DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "Status => %x \n", createPipeStatus);
                }
            }
        }

Вызов функции выглядит так (вызывая функцию после регистрации фильтра, но я тоже пробовал по-разному)

createPipe(L"mypipe", OBJ_KERNEL_HANDLE);
...