Я не могу создать именованный канал. Я пробовал разные комбинации, разные атрибуты, разные названия каналов. 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);