【学习记录】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");
    
}

 

posted @ 2021-01-02 21:21  五仁月饼  阅读(417)  评论(0编辑  收藏  举报