Procedure: Hoe om te bepalen of een toepassing is een Console of GUI

BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.

90493
Dit artikel is gearchiveerd. Het wordt aangeboden in de huidige vorm en wordt niet meer bijgewerkt.
Samenvatting
Om te bepalen of een toepassing console of GUI, moetparseren van de EXEheader. De kop bevat een veld 'Subsysteem' genoemd. Ditveld bepaalt zowel het subsysteem de toepassing uitgevoerd wordt onder detype interface vereist. De waarden bestaan uit:
   IMAGE_SUBSYSTEM_NATIVE               1   IMAGE_SUBSYSTEM_WINDOWS_GUI          2   IMAGE_SUBSYSTEM_WINDOWS_CUI          3   IMAGE_SUBSYSTEM_OS2_CUI              5   IMAGE_SUBSYSTEM_POSIX_CUI            7   IMAGE_SUBSYSTEM_NATIVE_WINDOWS       8   IMAGE_SUBSYSTEM_WINDOWS_CE_GUI       9				
Meer informatie

Voorbeeldcode

#include <windows.h>#include <winnt.h>VOID  main(int, char **);DWORD AbsoluteSeek(HANDLE, DWORD);VOID  ReadBytes(HANDLE, LPVOID, DWORD);VOID  WriteBytes(HANDLE, LPVOID, DWORD);VOID  CopySection(HANDLE, HANDLE, DWORD);#define XFER_BUFFER_SIZE 2048VOIDmain(int argc, char *argv[]){    HANDLE hImage;    DWORD  bytes;    DWORD  iSection;    DWORD  SectionOffset;    DWORD  CoffHeaderOffset;    DWORD  MoreDosHeader[16];    ULONG  ntSignature;    IMAGE_DOS_HEADER      image_dos_header;    IMAGE_FILE_HEADER     image_file_header;    IMAGE_OPTIONAL_HEADER image_optional_header;    IMAGE_SECTION_HEADER  image_section_header;    if (argc != 2)    {        printf("USAGE: %s program_file_name\n", argv[1]);        exit(1);    }    /*     *  Open the reference file.     */     hImage = CreateFile(argv[1],                        GENERIC_READ,                        FILE_SHARE_READ,                        NULL,                        OPEN_EXISTING,                        FILE_ATTRIBUTE_NORMAL,                        NULL);    if (INVALID_HANDLE_VALUE == hImage)    {        printf("Could not open %s, error %lu\n", argv[1], GetLastError());        exit(1);    }    /*     *  Read the MS-DOS image header.     */     ReadBytes(hImage,              &image_dos_header,              sizeof(IMAGE_DOS_HEADER));    if (IMAGE_DOS_SIGNATURE != image_dos_header.e_magic)    {        printf("Sorry, I do not understand this file.\n");        exit(1);    }    /*     *  Read more MS-DOS header.       */     ReadBytes(hImage,              MoreDosHeader,              sizeof(MoreDosHeader));    /*     *  Get actual COFF header.     */     CoffHeaderOffset = AbsoluteSeek(hImage, image_dos_header.e_lfanew) +                       sizeof(ULONG);    ReadBytes (hImage, &ntSignature, sizeof(ULONG));    if (IMAGE_NT_SIGNATURE != ntSignature)    {     printf("Missing NT signature. Unknown file type.\n");     exit(1);    }    SectionOffset = CoffHeaderOffset + IMAGE_SIZEOF_FILE_HEADER +                    IMAGE_SIZEOF_NT_OPTIONAL_HEADER;    ReadBytes(hImage,              &image_file_header,              IMAGE_SIZEOF_FILE_HEADER);    /*     *  Read optional header.     */     ReadBytes(hImage,              &image_optional_header,              IMAGE_SIZEOF_NT_OPTIONAL_HEADER);    switch (image_optional_header.Subsystem)    {    case IMAGE_SUBSYSTEM_UNKNOWN:        printf("Type is unknown.\n");        break;    case IMAGE_SUBSYSTEM_NATIVE:        printf("Type is native.\n");        break;    case IMAGE_SUBSYSTEM_WINDOWS_GUI:        printf("Type is Windows GUI.\n");        break;    case IMAGE_SUBSYSTEM_WINDOWS_CUI:        printf("Type is Windows CUI.\n");        break;    case IMAGE_SUBSYSTEM_OS2_CUI:        printf("Type is OS/2 CUI.\n");        break;    case IMAGE_SUBSYSTEM_POSIX_CUI:        printf("Type is POSIX CUI.\n");        break;    case IMAGE_SUBSYSTEM_NATIVE_WINDOWS:           printf("Type is native Win9x driver.\n");           break;       case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:           printf("Type is Windows CE.\n");           break;    default:        printf("Unknown type %u.\n", image_optional_header.Subsystem);        break;    }}DWORDAbsoluteSeek(HANDLE hFile,             DWORD  offset){    DWORD newOffset;    if ((newOffset = SetFilePointer(hFile,                                    offset,                                    NULL,                                    FILE_BEGIN)) == 0xFFFFFFFF)    {        printf("SetFilePointer failed, error %lu.\n", GetLastError());        exit(1);    }    return newOffset;}VOIDReadBytes(HANDLE hFile,          LPVOID buffer,          DWORD  size){    DWORD bytes;    if (!ReadFile(hFile,                  buffer,                  size,                  &bytes,                  NULL))    {        printf("ReadFile failed, error %lu.\n", GetLastError());        exit(1);    }    else if (size != bytes)    {        printf("Read the wrong number of bytes, expected %lu, got %lu.\n",               size, bytes);        exit(1);    }}				
3.10 3,50

Waarschuwing: dit artikel is automatisch vertaald

Eigenschappen

Artikel-id: 90493 - Laatst bijgewerkt: 02/27/2014 18:35:47 - Revisie: 4.0

  • Microsoft Win32-API
  • kbnosurvey kbarchive kbconsole kbhowto kbkernbase kbmt KB90493 KbMtnl
Feedback