Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 58 additions & 2 deletions Code/EnvironmentInformation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
// 2014/9/11 0.1 EvilKnight ����
// 2014/9/11 0.1 EvilKnight GeOSBit
// 2014/9/12 0.1 ray GetProcessBit()
// 2014/9/13 0.1 eoishf GetPEFileBit() GetBitByPEHeader()
// YYYY/MM/DD X.Y <���߻��޸�����> <�޸�����>
//
//*************************************************************************
Expand All @@ -21,6 +22,8 @@
#include <Psapi.h>
#include <tchar.h>
#include <strsafe.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "psapi.lib")

typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
Expand Down Expand Up @@ -142,7 +145,44 @@ ULONG GetMyselfBit(VOID)
*******************************************************************************/
ULONG GetPEFileBit(__in_z CONST PTCHAR pPEFilePath)
{
return 0 ;
FILE *peFile = NULL;
_wfopen_s(&peFile, pPEFilePath, L"rb");
if (NULL == peFile)
{
fclose(peFile);
return 0;
}

PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)malloc(sizeof(IMAGE_DOS_HEADER));
if (NULL == pDosHeader)
{
OutputErrorInformation(L"malloc", L"malloc failed");
return 0;
}

//��ȡPE�ļ���DOSͷ
fread(pDosHeader, sizeof(IMAGE_DOS_HEADER), 1, peFile);
if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
{
fclose(peFile);
return 0;
}

//���ļ�ָ��ƫ�Ƶ�PEͷ��
fseek(peFile, pDosHeader->e_lfanew, SEEK_SET);
free(pDosHeader);

IMAGE_NT_HEADERS imageNtHeaders;
//��ȡPEͷ
fread(&imageNtHeaders, sizeof(IMAGE_NT_HEADERS), 1, peFile);
if (imageNtHeaders.Signature != IMAGE_NT_SIGNATURE)
{
fclose(peFile);
return 0;
}
fclose(peFile);

return GetBitByPEHeader(&imageNtHeaders, sizeof(IMAGE_NT_HEADERS));
}

/*******************************************************************************
Expand All @@ -158,7 +198,23 @@ ULONG GetPEFileBit(__in_z CONST PTCHAR pPEFilePath)
ULONG GetBitByPEHeader(__in_bcount(uSize) CONST PVOID pPE,
__in CONST ULONG uSize)
{
// ����ͨ��IMAGE_NT_OPTIONAL_HDR_MAGIC���ж�
if (NULL == pPE)
{
return 0;
}

IMAGE_NT_HEADERS *pNtHeader = (IMAGE_NT_HEADERS *)pPE;
if (pNtHeader->FileHeader.Machine == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
{
return 32;
}

if (pNtHeader->FileHeader.Machine == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
{
return 64;
}

//���ΪIMAGE_ROM_OPTIONAL_HDR_MAGIC������0
return 0 ;
}

Expand Down