【学习记录】VS2017+win7驱动开发,sys加载失败问题
突然想试试win7驱动程序的开发,然后毫不犹豫的写了个HelloWorld程序,不清楚笔记本还是开发环境出现了什么毛病(可能只有我自己的开发环境出现了问题,搜索网上未找到有相同的问题),一个Hello World程序总是提示加载失败
开发环境:VS2017+WDK 10.0.17763.1(SDK也是相同的版本)
驱动加载环境:原装Win7 sp0
失败情况如下,其他驱动加载工具同样会失败
各种设置工程属性,全部无效,无奈,自己动手调试,最终定位到的问题为“CheckSum不匹配!!!”
真的不清楚开发环境为什么会出现这个问题,根据系统的算法自己实现了一个CheckSum计算工具,代码写的很丑,仅供参考(网上也有很多,也可已参考其他人的)
// checksum.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <Windows.h> void ReadFileToMemory(char **p,char *filepath) { FILE *pFile; fopen_s(&pFile, filepath, "rb"); fseek(pFile, 0, SEEK_END); DWORD dwFileSize = ftell(pFile); fseek(pFile, 0, SEEK_SET); PVOID pAllocAddress = VirtualAlloc(NULL, dwFileSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); fread_s(pAllocAddress, dwFileSize, dwFileSize, 1, pFile); fclose(pFile); *p = (char*)pAllocAddress; return; } DWORD ChkSum(DWORD BaseAddress,DWORD dwRva, DWORD dwNum) { DWORD dwData1 = 0; //DWORD dwNum1 = 0; while (dwRva) { dwData1 = *(WORD*)BaseAddress; dwRva--; dwNum = dwNum + dwData1; dwData1 = dwNum; dwData1 = dwData1 >> 0x10; dwNum = (WORD)dwNum + dwData1; BaseAddress = BaseAddress + 2; } DWORD dwResult = 0; dwResult = dwNum >> 0x10; dwResult = dwResult + dwNum; return dwResult; } int main() { char *pData = NULL; char File_Path_Buffer[MAX_PATH] = { 0 }; printf("please input file path:"); scanf_s("%s", File_Path_Buffer, MAX_PATH); FILE *pFile; fopen_s(&pFile, File_Path_Buffer, "rb"); fseek(pFile, 0, SEEK_END); DWORD dwFile_Size = ftell(pFile); fclose(pFile); ReadFileToMemory(&pData,File_Path_Buffer); PIMAGE_DOS_HEADER pDos = NULL; pDos = (PIMAGE_DOS_HEADER)pData; PIMAGE_NT_HEADERS pNt = NULL; pNt = (PIMAGE_NT_HEADERS)(pDos->e_lfanew + (DWORD)pDos); int dwRva = (DWORD)&(pNt->OptionalHeader.CheckSum) - (DWORD)pNt + pDos->e_lfanew; dwRva = dwRva >> 1; DWORD ChkSum1 = ChkSum((DWORD)pData, dwRva, 0); //printf("%08X\n", ChkSum1); DWORD pData1 = (DWORD)&(pNt->OptionalHeader.Subsystem); dwRva = (dwFile_Size - ((DWORD)&(pNt->OptionalHeader.CheckSum) - (DWORD)pNt + pDos->e_lfanew) - 4) >> 1; DWORD ChkSum2 = ChkSum(pData1, dwRva, (WORD)ChkSum1); //printf("%08X\n", ChkSum2); printf("ChkSum: %08X\n", ChkSum2 + dwFile_Size); system("pause"); }