diff --git a/Code/EnvironmentInformation.cpp b/Code/EnvironmentInformation.cpp index 83af594..7aa6449 100644 --- a/Code/EnvironmentInformation.cpp +++ b/Code/EnvironmentInformation.cpp @@ -2,18 +2,18 @@ // // Copyright (c) all 2014 All rights reserved // D a t e : 2014.9.11 -// 作 者 : -// 版 本 : 0.1 -// 功 能 : 运行环境相关信息函数 -// 说 明 : -// 备 注 : +// 浣 鑰 : +// 鐗 鏈 : 0.1 +// 鍔 鑳 : 杩愯鐜鐩稿叧淇℃伅鍑芥暟 +// 璇 鏄 : +// 澶 娉 : // -// 修改记录: -// 日 期 版本 修改人 修改内容 -// 2014/9/11 0.1 EvilKnight 创建 +// 淇敼璁板綍: +// 鏃 鏈 鐗堟湰 淇敼浜 淇敼鍐呭 +// 2014/9/11 0.1 EvilKnight 鍒涘缓 // 2014/9/11 0.1 EvilKnight GeOSBit // 2014/9/12 0.1 ray GetProcessBit() -// YYYY/MM/DD X.Y <作者或修改者名> <修改内容> +// YYYY/MM/DD X.Y <浣滆呮垨淇敼鑰呭悕> <淇敼鍐呭> // //************************************************************************* #include "EnvironmentInformation.h" @@ -30,11 +30,11 @@ LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( /******************************************************************************* * -* 函 数 名 : GetOSBit -* 功能描述 : 取得操作系统位数 -* 参数列表 : 无 -* 说 明 : -* 返回结果 : 如果成功,返回操作系统位数, 否则返回0 +* 鍑 鏁 鍚 : GetOSBit +* 鍔熻兘鎻忚堪 : 鍙栧緱鎿嶄綔绯荤粺浣嶆暟 +* 鍙傛暟鍒楄〃 : 鏃 +* 璇 鏄 : +* 杩斿洖缁撴灉 : 濡傛灉鎴愬姛锛岃繑鍥炴搷浣滅郴缁熶綅鏁, 鍚﹀垯杩斿洖0 * *******************************************************************************/ ULONG GetOSBit(VOID) @@ -52,11 +52,11 @@ ULONG GetOSBit(VOID) /******************************************************************************* * -* 函 数 名 : GetProcessBit -* 功能描述 : 取得指定进程位数 -* 参数列表 : dwPID -- 目标进程ID -* 说 明 : -* 返回结果 : 如果成功,返回进程位数, 否则返回0 +* 鍑 鏁 鍚 : GetProcessBit +* 鍔熻兘鎻忚堪 : 鍙栧緱鎸囧畾杩涚▼浣嶆暟 +* 鍙傛暟鍒楄〃 : dwPID -- 鐩爣杩涚▼ID +* 璇 鏄 : +* 杩斿洖缁撴灉 : 濡傛灉鎴愬姛锛岃繑鍥炶繘绋嬩綅鏁, 鍚﹀垯杩斿洖0 * *******************************************************************************/ ULONG GetProcessBit(__in CONST DWORD dwPID) @@ -79,27 +79,27 @@ ULONG GetProcessBit(__in CONST DWORD dwPID) __leave ; } - // 可以调用IsWow64Process + // 鍙互璋冪敤IsWow64Process //if (NULL != fnIsWow64Process) //{ - // // 如果成功了,闪人 + // // 濡傛灉鎴愬姛浜嗭紝闂汉 // if (fnIsWow64Process(hProcess, &bIsWow64)) // { - // // 如果bIsWow64等于TRUE的话,说明运行在WOW64下,为32位 + // // 濡傛灉bIsWow64绛変簬TRUE鐨勮瘽锛岃鏄庤繍琛屽湪WOW64涓嬶紝涓32浣 // uResult = bIsWow64 ? 32:64 ; // __leave ; // } //} - // 或GetProcessImageFileName - // QueryFullProcessImageName只支持vista以及之后的系统 + // 鎴朑etProcessImageFileName + // QueryFullProcessImageName鍙敮鎸乿ista浠ュ強涔嬪悗鐨勭郴缁 if(0 == GetProcessImageFileName(hProcess, szDriveName, MAX_PATH)) { OutputErrorInformation(TEXT("GetProcessBit"), TEXT("GetModuleFileNameEx")) ; __leave ; } - // 这里你要转换路径 + // 杩欓噷浣犺杞崲璺緞 if(VolumeDeviceToNtPath(szDriveName, szFileName)) { uResult = GetPEFileBit(szFileName) ; @@ -119,11 +119,11 @@ ULONG GetProcessBit(__in CONST DWORD dwPID) /******************************************************************************* * -* 函 数 名 : GetMyselfBit -* 功能描述 : 取得当前进程的位数 -* 参数列表 : 无 -* 说 明 : 无 -* 返回结果 : 返回当前进程位数 +* 鍑 鏁 鍚 : GetMyselfBit +* 鍔熻兘鎻忚堪 : 鍙栧緱褰撳墠杩涚▼鐨勪綅鏁 +* 鍙傛暟鍒楄〃 : 鏃 +* 璇 鏄 : 鏃 +* 杩斿洖缁撴灉 : 杩斿洖褰撳墠杩涚▼浣嶆暟 * *******************************************************************************/ ULONG GetMyselfBit(VOID) @@ -133,43 +133,81 @@ ULONG GetMyselfBit(VOID) /******************************************************************************* * -* 函 数 名 : GetPEFileBit -* 功能描述 : 取得可执行文件的位数 -* 参数列表 : pPEFilePath -- pe文件路径 -* 说 明 : 读pe文件的头进内存,再调用GetBitByPEHeader去判断 -* 返回结果 : 返回当前进程位数 +* 鍑 鏁 鍚 : GetPEFileBit +* 鍔熻兘鎻忚堪 : 鍙栧緱鍙墽琛屾枃浠剁殑浣嶆暟 +* 鍙傛暟鍒楄〃 : pPEFilePath -- pe鏂囦欢璺緞 +* 璇 鏄 : 璇籶e鏂囦欢鐨勫ご杩涘唴瀛橈紝鍐嶈皟鐢℅etBitByPEHeader鍘诲垽鏂 +* 杩斿洖缁撴灉 : 杩斿洖褰撳墠杩涚▼浣嶆暟 * *******************************************************************************/ ULONG GetPEFileBit(__in_z CONST PTCHAR pPEFilePath) { - return 0 ; + ULONG uResult = 0 ; + HANDLE hFile = CreateFile(pPEFilePath, GENERIC_READ, 0, NULL, OPEN_ALWAYS, 0, NULL); + if (hFile != NULL) + { + HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, 0); + LPCTSTR pMapping = (LPTSTR)MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0); + IMAGE_DOS_HEADER *idh = (IMAGE_DOS_HEADER*)pMapping; + if (idh->e_magic == IMAGE_DOS_SIGNATURE) + { + printf("dos headers found\n"); + IMAGE_NT_HEADERS *inh = (IMAGE_NT_HEADERS*)((DWORD)pMapping+idh->e_lfanew); + if (inh->Signature == IMAGE_NT_SIGNATURE) + { + printf("nt headers found\n"); + + // IMAGE_FILE_HEADER structure: http://msdn.microsoft.com/en-us/library/windows/desktop/ms680313(v=vs.85).aspx + switch(inh->FileHeader.Machine) + { + case 0x014c: + uResult = 32; + break; + case 0x8664: + uResult = 64; + break; + default: + uResult = 0;//0 stands for Intel Itanium + break; + } + //GetBitByPEHeader(); + + } + } + CloseHandle(hFile); + } + + + + return uResult ; } + /******************************************************************************* * -* 函 数 名 : GetBitByPEHeader -* 功能描述 :通过内存中的PE头来取得程序位数 -* 参数列表 : pPE -- 指向存储pe头的内存起始地址 -* uSize -- 指明存储pe头内存区域大小 -* 说 明 : 读pe文件的头进内存,再调用GetBitByPEHeader去判断 -* 返回结果 : 返回当前进程位数 +* 鍑 鏁 鍚 : GetBitByPEHeader +* 鍔熻兘鎻忚堪 :閫氳繃鍐呭瓨涓殑PE澶存潵鍙栧緱绋嬪簭浣嶆暟 +* 鍙傛暟鍒楄〃 : pPE -- 鎸囧悜瀛樺偍pe澶寸殑鍐呭瓨璧峰鍦板潃 +* uSize -- 鎸囨槑瀛樺偍pe澶村唴瀛樺尯鍩熷ぇ灏 +* 璇 鏄 : 璇籶e鏂囦欢鐨勫ご杩涘唴瀛橈紝鍐嶈皟鐢℅etBitByPEHeader鍘诲垽鏂 +* 杩斿洖缁撴灉 : 杩斿洖褰撳墠杩涚▼浣嶆暟 * *******************************************************************************/ ULONG GetBitByPEHeader(__in_bcount(uSize) CONST PVOID pPE, __in CONST ULONG uSize) { - // 可以通过IMAGE_NT_OPTIONAL_HDR_MAGIC来判断 + // 鍙互閫氳繃IMAGE_NT_OPTIONAL_HDR_MAGIC鏉ュ垽鏂 return 0 ; } /******************************************************************************* * -* 函 数 名 : VolumeDeviceToNtPath -* 功能描述 :逻辑路径转化成NT路径 -* 参数列表 : lpszDevicePath -- 逻辑路径 -* lpszFilePath -- NT路径 -* 说 明 : 哎,微软的示例代码.....我表示有点无语,就先这样吧! -* 返回结果 : 执行成功,返回TRUE +* 鍑 鏁 鍚 : VolumeDeviceToNtPath +* 鍔熻兘鎻忚堪 :閫昏緫璺緞杞寲鎴怤T璺緞 +* 鍙傛暟鍒楄〃 : lpszDevicePath -- 閫昏緫璺緞 +* lpszFilePath -- NT璺緞 +* 璇 鏄 : 鍝庯紝寰蒋鐨勭ず渚嬩唬鐮.....鎴戣〃绀烘湁鐐规棤璇紝灏卞厛杩欐牱鍚э紒 +* 杩斿洖缁撴灉 : 鎵ц鎴愬姛锛岃繑鍥濼RUE * *******************************************************************************/ BOOL VolumeDeviceToNtPath(__in_z LPCTSTR lpszDevicePath,