Из пеба ты вытяниш либог хендлый консоли либо линдлы пайпа (это если был редирект). После того как создал пайп на стороне драйвера нужно к нему присоединится, создать новый хендел, либо же в текущем процессе либо же в драйвере.(CreateFile) и вот его и подсунуть в PEB./
Ну вот в этом и проблема. Я создаю пайп (хендел возвращается ну и возвращается STATUS_PENDING ), и когда пытаюсь присоединиться к нему, ZwWaitForSingleObject уходит в ожидание и сидит там до второго пришествия. Или же надо полученный хендел попробовать открыть как-то?
Вам надо подсоединется к хендлу по которому вы ожидаете. В данном контексте будет равен ZwWaitForSingleObject http://msdn.microsoft.com/en-us/library/aa365146%28v=vs.85%29.aspx, и конечно будет ждать очень долго(без конечно) так как к нему не кто не подсоединяется. Вам нужно создать пайп-клинет с этим же именем что и пайп сервер. Пожалуйста почитайте про пайпы. http://msdn.microsoft.com/en-us/library/aa365780%28v=VS.85%29.aspx
shchetinin мдя, с файлом что-то я этот вопрос протупил... Бывает. Короче говоря. Пайпа создается, привязываю клиентскую часть уже непосредственно в PEB. После чего я в цикле пытаюсь посмотреть есть ли что-то в пайпе. А именно так Код (Text): ntStatus = ZwFsControlFile(hNewStdin, NULL, NULL, NULL, &iostBlock, FSCTL_PIPE_PEEK, NULL, 0, &pBuffer, sizeof(FILE_PIPE_PEEK_BUFFER)); if (ntStatus == STATUS_PENDING) { if (!NT_SUCCESS(ZwWaitForSingleObject(hNewStdin, FALSE, NULL))) { DPRINT("ZwWaitForSingleObject was failed\n"); } } else if (!NT_SUCCESS(ntStatus)) { DPRINT("ZwFsControlFile was failed\n"); return ntStatus; } Но тем не менее в пайпу какого-то ляда ничего не приходит. Дескрипторы подменяю так Код (Text): NTSTATUS GetDescriptors() { NTSTATUS ntStatus = STATUS_SUCCESS; PROCESS_BASIC_INFORMATION pi; DWORD retLen = 0; ntStatus = ZwQueryInformationProcess(NtCurrentProcess(), ProcessBasicInformation, &pi, sizeof(PROCESS_BASIC_INFORMATION), &retLen); if (!NT_SUCCESS(ntStatus)) { DPRINT("ZwQueryInformationProcess was failed\n"); return ntStatus; } hOldStdin = pi.PebBaseAddress->ProcessParameters->StandardInput; hOldStdout = pi.PebBaseAddress->ProcessParameters->StandardOutput; //pi.PebBaseAddress->ProcessParameters->StandardInput = hNewStdin; pi.PebBaseAddress->ProcessParameters->StandardOutput = hClientPipe; KeSetEvent(&evGetHandle, IO_NO_INCREMENT, FALSE); return STATUS_SUCCESS; }
red_mould Вы не сделали подключение к пайпу. И так есть серверная часть(вы её реализовали) теперь пам нужна часть клиента. Объсняюсь на пальцах(точнее на Win32) Сервер: HANDLE hPipe = CreateNamedPipe ("ServerPipeName") ;// Это было создания пайпа. NtCreateNamedPipeFile ConnectNamedPipe(hPipe) ;//Сдесь вы ожидаете клиента, у вас это будет функция ZwFsControlFile->ZwWaitForSingleObject ReadFile(hPipe) ; //После удачного соединения с клиентом можно получать данные, для это может быть ZwReadFile Клиент: hPipeToPEB = CreateFile("ServerPipeName") ; //Должна быть выполнена после CreateNamedPipe, иначе не будет существовать ссылка.() SetNamedPipeHandleState() WriteFile(hPipeToPEB); //Вот этот хендел вам и нужно будет ложить в PEB. Только вам придется выполнять код в приложении либо (КЛИЕНТСКУЮ ЧАСТЬ) либо в драйверe.Подумайте где будет лучше.