получение имени дескриптора процесса

Я пытаюсь получить имена дескрипторов процессов. Я перебираю список всех дескрипторов и пытаюсь получить имя следующим образом:

void SystemHandle::GetHandleName()
{
HANDLE hFake;
char* objectName = NULL;

if (NT_SUCCESS(DuplicateHandle(this->process, this->GetNativeHandle(), GetCurrentProcess(), &hFake, 0, FALSE, DUPLICATE_SAME_ACCESS)))
{
POBJECT_TYPE_INFORMATION typeInfo = (POBJECT_TYPE_INFORMATION)new BYTE[0x1000];
PUNICODE_STRING nameInfo = (PUNICODE_STRING)new BYTE[0x1000];
DWORD read;

NTSTATUS status = NtQueryObject(hFake, ObjectTypeInformation, typeInfo, 0x1000, &read);

std::cout << "NtQueryObject: " << status << ", Success: " << NT_SUCCESS(status) << "\n";

objectName = new char[nameInfo->Length];
if (NT_SUCCESS(status) && nameInfo->Length > 0)
{
std::cout << "nameInfo length: " << nameInfo->Length << "\n";
std::cout << "objectName size: " << sizeof(objectName) << "\n";
std::cout << "nameInfo buffer: " << sizeof(nameInfo->Buffer) << "\n";

WideToChar(objectName, nameInfo->Buffer);
strcpy_s(this->handleName, objectName);
}

delete nameInfo;
delete typeInfo;
}

if (hFake) CloseHandle(hFake);
}void WideToChar(char* Dest, const WCHAR* Source)
{
int i = 0;

// get each char from Source and put it in Dest
while(Source[i] != '\0')
{
Dest[i] = (CHAR)Source[i];

++i;
}

Dest[i] = '\0'; // create the end
}

Моя проблема начинается с WideToChar(objectName, nameInfo->Buffer); когда я доберусь до while(Source[i] != '\0'),
Я тогда получу следующее ошибка :

Unhandled exception at 0x00406CE5 in application.
exe: 0xC0000005: Access violation reading location 0xBAADF00D.

0

Решение

Вы выделяете память для nameInfo переменная, но не инициализируйте ее. Поэтому, когда вы пытаетесь использовать его, nameInfo->Buffer содержит 0xBAADF00D — Магический номер Microsoft для неинициализированной кучи памяти. Тогда вы получите нарушение доступа. Вы также должны использовать WideCharToMultibyte функция для преобразования строк.

1

Другие решения

заворачивать

    while(Source[i] != '\0')
{
Dest[i] = (CHAR)Source[i];

++i;
}

внутри условия if:

if(Source != NULL){
}
0

По вопросам рекламы [email protected]