Доброго времени суток. Работа в драйвере на ОС Windows XP/Vista/7 x86-32. # Задача: Получить командную строку процесса с которой он был запущен зная PID и дескриптор процесса. Код (Text): #ifndef TPEB_H #define TPEB_H #include "Defines.h" typedef struct _PEB_LDR_DATA { BYTE Reserved1[8]; PVOID Reserved2[3]; LIST_ENTRY InMemoryOrderModuleList; } PEB_LDR_DATA, *PPEB_LDR_DATA; typedef struct _RTL_USER_PROCESS_PARAMETERS { BYTE Reserved1[16]; PVOID Reserved2[10]; UNICODE_STRING ImagePathName; UNICODE_STRING CommandLine; } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS; typedef VOID (NTAPI *PPS_POST_PROCESS_INIT_ROUTINE) (VOID); typedef struct _PEB { BYTE Reserved1[2]; BYTE BeingDebugged; BYTE Reserved2[1]; PVOID Reserved3[2]; PPEB_LDR_DATA Ldr; PRTL_USER_PROCESS_PARAMETERS ProcessParameters; BYTE Reserved4[104]; PVOID Reserved5[52]; PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine; BYTE Reserved6[128]; PVOID Reserved7[1]; ULONG SessionId; } PEB, *PPEB; PPEB PsGetProcessPeb(IN PEPROCESS Process); void GetCommandLineByProcess(PEPROCESS proc, HANDLE procId) { PPEB pPeb = NULL; KAPC_STATE apcState; PRTL_USER_PROCESS_PARAMETERS pp = NULL; // ---- KeStackAttachProcess(proc, & apcState); // ---- pPeb = PsGetProcessPeb(proc); // ---- DPRINT("[GetCommandLineByProcess] pPeb: %d;\n\0", pPeb); // ---- pp = pPeb->ProcessParameters; // ---- DPRINT("[GetCommandLineByProcess] pPeb->ProcessParameters: %d;\n\0", pp); // ---- DPRINT("[GetCommandLineByProcess] ImagePathName.Length: %d; CommandLine.Length: %d;\n\0", pp->ImagePathName.Length, pp->CommandLine.Length); // ---- DPRINT("[GetCommandLineByProcess] ImagePathName: '%wZ';\n\0", pp->ImagePathName.Buffer); // ---- DPRINT("[GetCommandLineByProcess] CommandLine: '%wZ';\n\0", pp->CommandLine.Buffer); // ---- KeUnstackDetachProcess( & apcState); } #endif # Структуры взял с MSDN: # Лог: - Как видно даже последнего символа ' нет, он не выводится. P.S. -> Прошу помочь разобраться, в чём проблема.
Посмею предположить, что лог ведется через вызовы ANSI-функций. Что несвойственно человеку, имеющему дело с драйверами, где всюду Unicode.
# Отредактировано: Усё, проблема решена. - А точнее решена проблема моих слепых глаз =) - Необходимо передавать указатель на UNICODE_STRING (PUNICODE_STRING). Код (Text): //%ws - WCHAR*; //%wZ - PUNICODE_STRING; DPRINT("[GetCommandLineByProcess] ImagePathName: '%wZ';\n\0", & pp->ImagePathName); DPRINT("[GetCommandLineByProcess] CommandLine: '%wZ';\n\0", & pp->CommandLine);
Ну это же все известно Хотя бы вот http://msdn.microsoft.com/en-us/library/hf4y5e3w%28v=vs.80%29.aspx %wZ - allow to use pointer to UNICODE_STRING as parameter for printing При желании можно найти ещё.