Здравствуйте! Выбрал один из немногих вариантов по доставанию полного пути к исполнительному файлу процесса - танцы с PEB. Имеется функция, но она не работает(как минимум на Windows 7 x64) возвращает нулл: Код (Text): #define BASE_PROCESS_PEB_OFFSET 0x01B0 #define BASE_PEB_PROCESS_PARAMETER_OFFSET 0x0010 #define BASE_PROCESS_PARAMETER_FULL_IMAGE_NAME 0x003C #define W2003_BASE_PROCESS_PEB_OFFSET 0x0190 #define W2003_BASE_PROCESS_PEB_OFFSET_SP1 0x01A0 #define VISTA_BASE_PROCESS_PEB_OFFSET 0x0188 PCWSTR GetProcessFullName() { ULONG OsMajorVersion; ULONG OsMinorVersion ; ULONG dwAddress; if(KeGetCurrentIrql() != PASSIVE_LEVEL) { return NULL; } try { dwAddress = (ULONG)PsGetCurrentProcess(); if(dwAddress == 0 || dwAddress == 0xFFFFFFFF) { return NULL; } PsGetVersion(&OsMajorVersion, &OsMinorVersion, NULL, NULL); if( OsMajorVersion < 5 || OsMinorVersion > 2 ) { return NULL; } if( OsMajorVersion == 5 && OsMinorVersion < 2) { dwAddress += BASE_PROCESS_PEB_OFFSET; } if(OsMajorVersion == 5 && OsMinorVersion ==2) { dwAddress += W2003_BASE_PROCESS_PEB_OFFSET; } if(OsMajorVersion == 6 && OsMinorVersion ==0) { dwAddress += VISTA_BASE_PROCESS_PEB_OFFSET; } if((dwAddress = *(ULONG*)dwAddress) == 0) { return NULL; } dwAddress += BASE_PEB_PROCESS_PARAMETER_OFFSET; if((dwAddress = *(ULONG*)dwAddress) == 0) { return NULL; } dwAddress += BASE_PROCESS_PARAMETER_FULL_IMAGE_NAME; if((dwAddress = *(ULONG*)dwAddress) == 0) { return NULL; } } except (EXCEPTION_EXECUTE_HANDLER) { try { if(OsMajorVersion == 5 && OsMinorVersion ==2) {dwAddress = (ULONG)PsGetCurrentProcess(); dwAddress += W2003_BASE_PROCESS_PEB_OFFSET_SP1; if((dwAddress = *(ULONG*)dwAddress) == 0) { return NULL; } dwAddress += BASE_PEB_PROCESS_PARAMETER_OFFSET; if((dwAddress = *(ULONG*)dwAddress) == 0) { return NULL; } dwAddress += BASE_PROCESS_PARAMETER_FULL_IMAGE_NAME; if((dwAddress = *(ULONG*)dwAddress) == 0) { return NULL; } return (PCWSTR)dwAddress; } } except (EXCEPTION_EXECUTE_HANDLER) { } return NULL; } return (PCWSTR)dwAddress; }
Hippey Мил человек, как же она у тебя работать будет на 7 x64, если там версия ядра 6.2, а этот случай у тебя тупо не учитывается в коде? Заканчивай копипастить и начинай вникать в то, что пишешь. Кроме того, адрес PEB замечательно берётся функцией PsGetProcessPeb(), не надо никаких смещений для этого. И даже, чтобы путь к файлу процесса получить оттуда, тоже никаких смещений не надо, структура частично документирована и эти её поля не менялись вплоть до Windows 7 (что там в восьмёрке, я не в курсе).
Peb->ProcessParameters +0x10 для x86, +0x20 для x64 ProcessParameters->ImagePathName +0x38 для x86 +0x60 для x64 + если обращаться к ImagePathName из CREATE_PROCESS_NOTIFY_ROUTINE при создании процесса, надо учитывать, что структура проинициализирована не полностью, в частности ImagePathName->Buffer будет содержать не адрес, а смещение относительно Peb->ProcessParameters.