⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dlgmain.cpp

📁 WDM驱动开发的辅助工具 非常好用 欢迎大家下载
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            MAKEFILE_FNAME, NULL);
        FMessageBox(hWnd, MB_ICONERROR, _T("WDMbuild"),
            _T("创建 \"%s\" 文件失败:%s"), caFileName, caBuffer);
        return FALSE;
    }
    if ( !CreateSourcesFile(g_Sys.Option.caDriverName,
            g_Sys.Option.caSourcePath) ){
        GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
        MakeFileName(caFileName, g_Sys.Option.caSourcePath,
            SOURCES_FNAME, NULL);
        FMessageBox(hWnd, MB_ICONERROR, _T("WDMbuild"),
            _T("创建 \"%s\" 文件失败:%s"), caFileName, caBuffer);
        return FALSE;
    }
    if ( !CallDDK(lpVersion) ){
        GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
        FMessageBox(hWnd, MB_ICONERROR, _T("WDMbuild"),
            _T("调用 DDK 构造驱动程序失败:%s"), caBuffer);
        return FALSE;
    }
    if ( !GetDDKResult(&bErrOccur, caBuffer,lpVersion) ){
        GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
        FMessageBox(hWnd, MB_ICONERROR, _T("WDMbuild"),
            _T("读取 DDK 编译结果失败: %s"), caBuffer);
        return FALSE;
    }
    else if ( bErrOccur ){
        FMessageBox(hWnd, MB_ICONERROR, _T("WDMbuild"),
            _T("构造驱动程序失败:\n\n%s\n"), caBuffer);
        return FALSE;
    }
    if ( !CopyDrivers(lpVersion) ){
        GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
        FMessageBox(hWnd, MB_ICONERROR, _T("WDMbuild"),
            _T("拷贝 %s.sys 文件到 %s 目录失败: %s"),
            g_Sys.Option.caDriverName, g_Sys.Option.caCopyToPath,
            caBuffer);
        return FALSE;
    }
    return TRUE;
}

BOOL    CreateMakefileFile(LPCTSTR lpDestPath)
{   TCHAR caFileName[_MAX_PATH];

    MakeFileName(caFileName, lpDestPath, MAKEFILE_FNAME, NULL);
    return WriteResourceToFile(caFileName,
                g_Sys.hModule,
                LPTSTR(IDR_MAKEFILE),
                _T("FILE"));
}

BOOL    CreateSourcesFile(LPCTSTR lpDriverName, LPCTSTR lpDestPath)
{   TCHAR   caPart1[_MAX_PATH]  = _T("TARGETNAME=");
    TCHAR   caPart2[         ]  = _T("TARGETTYPE=DRIVER\r\n"
                                     "TARGETPATH=OBJ\r\n"
                                     "\r\n"
                                     "INCLUDES=$(BASEDIR)\\inc\r\n"
                                     "\r\n");
    TCHAR   caPart3[MAX_STRING] = _T("SOURCES=");
    TCHAR   caPart4[MAX_STRING] = _T("i386_SOURCES=");
    LPCTSTR saCFile[]           = {_T("*.c"  ), _T("*.cpp"), _T("*.rc"), NULL};
    LPCTSTR saAsmFile[]         = {_T("*.asm"), NULL};
    LPCTSTR saIncFile[]         = {_T("*.inc"), NULL};

    LPTSTR  lpPlace             = NULL;
    TCHAR   caFName[_MAX_PATH];
    TCHAR   caSubDir[_MAX_PATH];

    HANDLE  hFile               = NULL;
    INT     iStrLen             = 0L;
    DWORD   dwWritten           = 0L;
    INT     i                   = 0;

    /////////////Create i386 directory/////////////////////////////////////////
    wsprintf(caSubDir, _T("%s\\i386"), lpDestPath);
    if ( (!DirectoryExist(caSubDir))&&(!CreateDirectory(caSubDir, NULL)) ){

        return FALSE;
    }
    /////////////Copy *.asm files to i386 directory////////////////////////////
    for (i = 0; NULL != saAsmFile[i]; i++){

        wsprintf(caFName, _T("%s\\%s"), lpDestPath, saAsmFile[i]);
        if ( FileExist(caFName)&&(!CopyFilesTo(caFName, caSubDir, FALSE)) ){

            return FALSE;
        }
    }
    /////////////Copy *.inc files to i386 directory////////////////////////////
    for (i = 0; NULL != saIncFile[i]; i++){

        wsprintf(caFName, _T("%s\\%s"), lpDestPath, saIncFile[i]);
        if ( FileExist(caFName)&&(!CopyFilesTo(caFName, caSubDir, FALSE)) ){

            return FALSE;
        }
    }
    ////////////Make 'TARGETNAME' section//////////////////////////////////////
    lstrcat(caPart1, lpDriverName);
    lstrcat(caPart1, _T("\r\n"));
    ////////////Make 'SOURCES' section////////////////////////////////////////
    for (i = 0; NULL != saCFile[i]; i++){

        wsprintf(caFName, _T("%s\\%s"), lpDestPath, saCFile[i]);
        iStrLen = lstrlen(caPart3);
        GetFilesName(
            caPart3 + iStrLen, 
            MAX_STRING - iStrLen,
            caFName,
            NULL,
            _T("\\\r\n        "),
            NULL);
    }
    lpPlace = _tcsrchr(caPart3, '\\');
    if ( NULL != lpPlace ){

        *lpPlace = '\r';
        *(lpPlace+1) = '\n';
        *(lpPlace+2) = '\0';
    }
    ////////////Make 'i386_SOURCES' section////////////////////////////////////
    for (i = 0; NULL != saAsmFile[i]; i++){

        wsprintf(caFName, _T("%s\\%s"), lpDestPath, saAsmFile[i]);
        iStrLen = lstrlen(caPart4);
        GetFilesName(
            caPart4 + iStrLen, 
            MAX_STRING - iStrLen,
            caFName,
            NULL,
            _T("\\\r\n             "),
            NULL);
    }
    lpPlace = _tcsrchr(caPart4, '\\');
    if ( NULL != lpPlace ){

        *lpPlace = '\0';
    }
    ////////////Create 'SOURCES' file//////////////////////////////////////////
    wsprintf(caFName, _T("%s\\%s"), lpDestPath, SOURCES_FNAME);
    hFile = CreateFile(
                caFName,
                GENERIC_WRITE,
                0,
                NULL,
                CREATE_ALWAYS,
                FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
                NULL);
    if (INVALID_HANDLE_VALUE == hFile){

        return FALSE;
    }
    if ( WriteFile(hFile, caPart1, lstrlen(caPart1), &dwWritten, NULL) &&
         WriteFile(hFile, caPart2, lstrlen(caPart2), &dwWritten, NULL) &&
         WriteFile(hFile, caPart3, lstrlen(caPart3), &dwWritten, NULL) &&
         WriteFile(hFile, caPart4, lstrlen(caPart4), &dwWritten, NULL) ){

        return CloseHandle(hFile);
    }
    CloseHandle(hFile);
    return FALSE;
}

BOOL    CallDDK(LPCTSTR lpVersion)
{   LPCTSTR             lpChecked             = _T("checked");
    LPCTSTR             lpFree                = _T("free");
    TCHAR               caFileName[_MAX_PATH];
    TCHAR               caCmdLine[_MAX_PATH];
    STARTUPINFO         SI                    = {0};
    PROCESS_INFORMATION PI                    = {0};

    if ( (lstrcmpi(lpChecked, lpVersion) != 0) &&
         (lstrcmpi(lpFree,    lpVersion) != 0) ){

        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }
    MakeFileName(caFileName, g_Sys.caPath, CALLDDK_FNAME, NULL);
    wsprintf(
        caCmdLine,
        _T("%s %s %s %s"),
        caFileName,
        g_Sys.Option.caDDKPath,
        lpVersion,
        g_Sys.Option.caSourcePath);
    if ( CreateProcess(NULL, caCmdLine, NULL, NULL, FALSE, CREATE_NO_WINDOW,
                       NULL, g_Sys.caPath, &SI, &PI) ){
        CloseHandle(PI.hThread);
        if (WaitForSingleObject(PI.hProcess, TIMEOUT_ELAPSE) == WAIT_TIMEOUT){
            return FALSE;
        }
        CloseHandle(PI.hProcess);
        return TRUE;
    }
    return FALSE;
}

BOOL    GetDDKResult(BOOL *pbErrOccur, VOID *pvErrMsg, LPCTSTR lpVersion)
{   LPCTSTR lpChecked       = _T("checked");
    LPCTSTR lpFree          = _T("free");
    LPCTSTR lpErrFileName   = NULL;
    TCHAR   caFileName[_MAX_PATH];
    HANDLE  hFile           = NULL;
    DWORD   dwSize          = 0L;
    DWORD   dwReaded        = 0L;

    lpErrFileName = (lstrcmp(lpChecked, lpVersion) == 0) ? CHK_ERR_FNAME :
                    (lstrcmp(lpFree,    lpVersion) == 0) ? FRE_ERR_FNAME :
                    NULL;
    if ( NULL == lpErrFileName ){
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }
    MakeFileName(caFileName, g_Sys.Option.caSourcePath, lpErrFileName, NULL);
    if ( FileExist(caFileName) ){
        *pbErrOccur = TRUE;
        if ( NULL != pvErrMsg ){
            hFile = CreateFile(
                        caFileName,
                        GENERIC_READ,
                        FILE_SHARE_READ,
                        NULL,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL);
            if ( INVALID_HANDLE_VALUE == hFile ){
                return FALSE;
            }
            dwSize = GetFileSize(hFile, NULL);
            if ( !ReadFile(hFile, pvErrMsg, dwSize, &dwReaded, NULL) ){
                CloseHandle(hFile);
                return FALSE;
            }
            *(LPTSTR(pvErrMsg) + dwSize) = '\0';
            CloseHandle(hFile);
            return TRUE;
        }
    }
    *pbErrOccur = FALSE;
    return TRUE;
}

BOOL    CopyDrivers(LPCTSTR lpVersion)
{   TCHAR caObjPath[_MAX_PATH];
    TCHAR caObjFile[_MAX_PATH];
    TCHAR caDstFile[_MAX_PATH];

    if (lstrcmp(_T("checked"), lpVersion) == 0){
        MakeFileName(caObjPath, g_Sys.Option.caSourcePath,
            _T("objchk\\i386"), NULL);
    }
    else if (lstrcmp(_T("free"), lpVersion) == 0){
        MakeFileName(caObjPath, g_Sys.Option.caSourcePath,
            _T("objfre\\i386"), NULL);
    }
    else{
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }
    MakeFileName(caObjFile, caObjPath, g_Sys.Option.caDriverName, _T(".sys"));
    MakeFileName(caDstFile, g_Sys.Option.caCopyToPath,
        g_Sys.Option.caDriverName, _T(".sys"));
    return CopyFile(caObjFile, caDstFile, FALSE);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -