2015-01-09 3 views
0

프로세스 핸들의 이름을 얻으려고합니다. 나는 모든 핸들의 목록 물마루 반복하고 같은 이름을 얻으려고 : 나는 while(Source[i] != '\0')에 도착하면프로세스 핸들 이름을 얻는 중

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);에서 시작됩니다. 는 IF 조건 내에서

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

왜 [WideCharToMultiByte] (http://msdn.microsoft.com/en-us/library/dd374130.aspx) 또는 [wcstombs] (http : //msdn.microsoft.com/en-us/library/5d7tc9zw.aspx)? –

답변

1

당신은 nameInfo 변수에 대한 메모리를 할당하지만 초기화하지 않습니다 그것. 따라서 사용하려고하면 nameInfo->Buffer0xBAADF00D - 초기화되지 않은 힙 메모리의 Microsoft 마법 번호가 포함되어 있습니다. 그런 다음 액세스 위반이 발생합니다. 문자열 변환을 위해서는 WideCharToMultibyte 함수를 사용해야합니다.

0

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

     ++i; 
    } 

:
나는 다음 오류을 얻을 것이다

if(Source != NULL){ 
} 
관련 문제