windows - Få billedstørrelse af dll indlæst i en anden proces?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger følgende metode til at få imagesize af en DLL indlæst i en anden proces:


HANDLE hProcess = OpenProcess( PROCESS\_ALL\_ACCESS, FALSE, processId);
if( hProcess == NULL ) {
  printError( TEXT("OpenProcess") );
  return false;
} else {
    MEMORY\_BASIC\_INFORMATION mem;
    if (NULL==VirtualQueryEx(hProcess, (LPCVOID)modBaseAddress,
        &mem, sizeof(mem))) {
        printError( TEXT("VirtualQueryEx") );
        return false;
    }
    unsigned char* allocationBase = (unsigned char*)mem.AllocationBase;
    \_tprintf( TEXT("
 allocationBase = \%d"), allocationBase );

    IMAGE\_DOS\_HEADER *dos = (IMAGE\_DOS\_HEADER*)mem.AllocationBase;

    unsigned long dos1 = (unsigned long)dos;
    unsigned long dos2 = (unsigned long)dos->e\_lfanew;
    //\_tprintf( TEXT("
 ... = \%d"), dos2); crash
    IMAGE\_NT\_HEADERS *pe = (IMAGE\_NT\_HEADERS*)(dos1+dos2); // also crash


    if(pe->Signature != IMAGE\_NT\_SIGNATURE) {
        std::cout  <<  "[Error] GetDllMemInfo failedpe points to a bad location"  <<  std::endl;
        return false;
    }

    size\_t base\_len = (size\_t)pe->OptionalHeader.SizeOfImage;
    \_tprintf( TEXT("
  baselen = \%d"), base\_len );
    CloseHandle( hProcess );
}


Men som du kan se i kommentarerne, kan jeg ikke bruge 'dos-> e\_lfanew'. Det er ligegyldigt hvad jeg gør med det, min applcation kolliderer altid uden advarsel (DEBUG bygger selvfølgelig). Hvad kan forårsage denne fejl? Hvordan kan jeg rette det? Er der en bedre måde at få den 'base\_len' (billedstørrelse) af DLL'en på?

Bedste reference