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

📄 dlgmain.cpp

📁 WDM驱动开发的辅助工具 非常好用 欢迎大家下载
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#include <errno.h>
#include "resource.h"
#include "Define.h"
#include "Common.h"
#include "DlgMain.h"
#include "DlgOption.h"
#include "DlgHelp.h"

extern SYSTEM g_Sys;

BOOL CALLBACK DlgMain(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM)
{   static  DLGMAIN Dlg = {0};

    switch (uMsg){
        case WM_INITDIALOG: return InitDlgMain(hDlg, &Dlg);
        case WM_LBUTTONDOWN:
            SendMessage(hDlg, WM_NCLBUTTONDOWN, HTCAPTION, 0);
            return TRUE;
        case WM_COMMAND:
            switch (LOWORD(wParam)){
                case IDBN_CHECK:    return DlgMainOnCheck  (hDlg, &Dlg);
                case IDBN_FREE:     return DlgMainOnFree   (hDlg, &Dlg);
                case IDBN_INSTALL:  return DlgMainOnInstall(hDlg, &Dlg);
                case IDBN_START:    return DlgMainOnStart  (hDlg, &Dlg);
                case IDBN_STOP:     return DlgMainOnStop   (hDlg, &Dlg);
                case IDBN_UNINST:   return DlgMainOnUninst (hDlg, &Dlg);
                case IDBN_OPTION:   return DlgMainOnOption (hDlg, &Dlg);
                case IDBN_HELP:     return DlgMainOnHelp   (hDlg, &Dlg);
                default: break;
            }
            break;
        case WM_CLOSE: return DlgMainOnClose(hDlg, &Dlg);
        default: break;
    }
    return FALSE;
}

BOOL    InitDlgMain(HWND hDlg, PDLGMAIN pDlg)
{   TCHAR caBuffer[MAX_STRING];

    g_Sys.hWnd = hDlg;
    SetClassLong(hDlg, GCL_HICON, (LONG)g_Sys.hIcon);
    //SetWindowPos(hDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
    pDlg->hDlg       = hDlg;
    pDlg->hBnCheck   = GetDlgItem(hDlg, IDBN_CHECK);
    pDlg->hBnFree    = GetDlgItem(hDlg, IDBN_FREE);
    pDlg->hBnInstall = GetDlgItem(hDlg, IDBN_INSTALL);
    pDlg->hBnStart   = GetDlgItem(hDlg, IDBN_START);
    pDlg->hBnStop    = GetDlgItem(hDlg, IDBN_STOP);
    pDlg->hBnUninst  = GetDlgItem(hDlg, IDBN_UNINST);
    pDlg->hBnOption  = GetDlgItem(hDlg, IDBN_OPTION);
    pDlg->hBnHelp    = GetDlgItem(hDlg, IDBN_HELP);
    pDlg->uTimerID   = SetTimer(hDlg, TIMER_ID, TIMER_ELAPSE, TimerProc);
    if ( 0 == pDlg->uTimerID ){
        GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
        FMessageBox(hDlg, MB_ICONERROR, _T("WDMbuild"),
            _T("设置定时器失败:%s"), caBuffer);
        return PostMessage(hDlg, WM_CLOSE, 0, 0);
    }
    if ( NULL == g_Sys.hSCManager ){
        EnableWindow(pDlg->hBnInstall, FALSE);
        EnableWindow(pDlg->hBnStart  , FALSE);
        EnableWindow(pDlg->hBnStop   , FALSE);
        EnableWindow(pDlg->hBnUninst , FALSE);
    }
    return TRUE;
}

BOOL    DlgMainOnCheck(HWND hDlg, PDLGMAIN pDlg)
{
    SetCursor(LoadCursor(NULL, IDC_WAIT));
    if ( Build(hDlg, _T("checked")) ){
        MessageBox(hDlg, _T("操作成功!"), _T("WDMbuild"), MB_ICONASTERISK);
    }
    SetCursor(LoadCursor(NULL, IDC_ARROW));
    return TRUE;
}

BOOL    DlgMainOnFree(HWND hDlg, PDLGMAIN pDlg)
{
    SetCursor(LoadCursor(NULL, IDC_WAIT));
    if ( Build(hDlg, _T("free")) ){
        MessageBox(hDlg, _T("操作成功!"), _T("WDMbuild"), MB_ICONASTERISK);
    }
    SetCursor(LoadCursor(NULL, IDC_ARROW));
    return TRUE;
}

BOOL    DlgMainOnInstall(HWND hDlg, PDLGMAIN pDlg)
{   LPCTSTR lpServiceName = NULL;
    LPCTSTR lpDisplayName = NULL;
    LPCTSTR lpDriverName  = NULL;
    LPCTSTR lpDriverPath  = NULL;
    TCHAR   caFileName[_MAX_PATH];
    TCHAR   caBuffer[MAX_STRING];
    DWORD   dwStartType   = SERVICE_AUTO_START;

    lpServiceName = 
    lpDisplayName = 
    lpDriverName  = g_Sys.Option.caDriverName;
    lpDriverPath  = g_Sys.Option.caCopyToPath;
    MakeFileName(caFileName, lpDriverPath, lpDriverName, _T(".SYS"));
    if ( !InstallAService(g_Sys.hSCManager, caFileName,
                          lpServiceName, lpDisplayName, dwStartType) ){
        GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
        FMessageBox(hDlg, MB_ICONERROR, _T("WDMbuild"),
            _T("安装“%s”服务失败:%s"), lpServiceName, caBuffer);
    }
    return TRUE;
}

BOOL    DlgMainOnUninst(HWND hDlg, PDLGMAIN pDlg)
{   LPCTSTR lpServiceName = g_Sys.Option.caDriverName;
    TCHAR   caBuffer[MAX_STRING];

    if ( !UninstallAService(g_Sys.hSCManager, lpServiceName) ){
        GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
        FMessageBox(hDlg, MB_ICONERROR, _T("WDMbuild"),
            _T("卸载“%s”服务失败:%s"), lpServiceName, caBuffer);
    }
    return TRUE;
}

BOOL    DlgMainOnStart(HWND hDlg, PDLGMAIN pDlg)
{   LPCTSTR lpServiceName = g_Sys.Option.caDriverName;
    TCHAR   caBuffer[MAX_STRING];

    lpServiceName = g_Sys.Option.caDriverName;
    if ( !StartAService(g_Sys.hSCManager, lpServiceName) ){
        GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
        FMessageBox(hDlg, MB_ICONERROR, _T("WDMbuild"),
            _T("启动“%s”服务失败:%s"), lpServiceName, caBuffer);
    }
    return TRUE;
}

BOOL    DlgMainOnStop(HWND hDlg, PDLGMAIN pDlg)
{   LPCTSTR lpServiceName = g_Sys.Option.caDriverName;
    TCHAR   caBuffer[MAX_STRING];

    lpServiceName = g_Sys.Option.caDriverName;
    if ( !StopAService(g_Sys.hSCManager, lpServiceName) ){
        GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
        FMessageBox(hDlg, MB_ICONERROR, _T("WDMbuild"),
            _T("停止“%s” 服务失败:%s"), lpServiceName, caBuffer);
    }
    return TRUE;
}

BOOL    DlgMainOnOption(HWND hDlg, PDLGMAIN pDlg)
{   TCHAR caBuffer[MAX_STRING];

    if ( -1 == DialogBox(g_Sys.hModule, LPTSTR(IDD_OPTION), hDlg, DlgOption) ){
        GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
        FMessageBox(hDlg, MB_ICONERROR, _T("WDMbuild"),
            _T("创建对话框失败:%s"), caBuffer);
    }
    return TRUE;
}

BOOL    DlgMainOnHelp(HWND hDlg, PDLGMAIN pDlg)
{   TCHAR caBuffer[MAX_STRING];

    if ( -1 == DialogBox(g_Sys.hModule, LPTSTR(IDD_HELP), hDlg, DlgHelp) ){
        GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
        FMessageBox(hDlg, MB_ICONERROR, _T("WDMbuild"),
            _T("创建对话框失败:%s"), caBuffer);
    }
    return TRUE;
}

BOOL    DlgMainOnClose(HWND hDlg, PDLGMAIN pDlg)
{
    if ( (UINT)0 != pDlg->uTimerID ){
        KillTimer(hDlg, pDlg->uTimerID);
    }
    return EndDialog(hDlg, 0);
}

VOID CALLBACK TimerProc(HWND hWnd, UINT, UINT, DWORD)
{   TCHAR   caBuffer[MAX_STRING];
    LPCTSTR lpText;
    DWORD   dwStatus;

    dwStatus = GetServiceStatus(g_Sys.hSCManager, g_Sys.Option.caDriverName);
    switch (dwStatus){
        case SERVICE_STOPPED         : lpText = _T("Stopped");          break;
        case SERVICE_START_PENDING   : lpText = _T("Start Pending");    break;
        case SERVICE_STOP_PENDING    : lpText = _T("Stop Pending");     break;
        case SERVICE_RUNNING         : lpText = _T("Runing");           break;
        case SERVICE_CONTINUE_PENDING: lpText = _T("Continue Pending"); break;
        case SERVICE_PAUSE_PENDING   : lpText = _T("Pause Pending");    break;
        case SERVICE_PAUSED          : lpText = _T("Paused");           break;
        default                      : lpText = _T("Uninstall");        break;
    }
    wsprintf(caBuffer, _T("%s - %s: %s"), 
        g_Sys.caName, g_Sys.Option.caDriverName, lpText);
    SetWindowText(hWnd, caBuffer);
}

BOOL    CheckOption(HWND hWnd)
{   TCHAR caBuffer[MAX_STRING];
    INT   iReturn = 0;

    if ( IsOptionError(NULL, NULL, &(g_Sys.Option)) ){
        if ( IDYES == MessageBox(hWnd, 
                        _T("系统 'Option' 设置不正确!\n\n"
                           "要修改系统 'Option' 设置么?"),
                        _T("WDMbuild"), 
                        MB_YESNO | MB_ICONERROR) ){
            iReturn = DialogBox(g_Sys.hModule, LPTSTR(IDD_OPTION),
                        hWnd, DlgOption);
            if ( -1 == iReturn ){
                GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
                FMessageBox(hWnd, MB_ICONERROR, _T("WDMbuild"),
                    _T("创建对话框失败: %s"), caBuffer);
                return FALSE;
            }
            return ( IDOK == iReturn );
        }
        return FALSE;
    }
    return TRUE;
}

BOOL    CheckSourcePath(VOID)
{   LPCTSTR saSourceFile[] = {_T("*.c"),
                              _T("*.cpp"),
                              _T("*.asm"),
                              _T("*.rc"),
                              NULL};
    TCHAR   caFileName[_MAX_PATH];
    INT     i;

    for ( i = 0; NULL != saSourceFile[i]; i++ ){
        MakeFileName(caFileName,
            g_Sys.Option.caSourcePath, saSourceFile[i], NULL);
        if ( FileExist(caFileName) ){
            return TRUE;
        }
    }
    return FALSE;
}

BOOL    Build(HWND hWnd, LPCTSTR lpVersion)
{   TCHAR caBuffer[MAX_STRING]  = {0};
    TCHAR caFileName[_MAX_PATH] = {0};
    BOOL  bErrOccur             = FALSE;

    if ( !CheckOption(hWnd) ){
        return FALSE;
    }
    if ( !CheckSourcePath() ){
        FMessageBox(hWnd, MB_ICONERROR, _T("WDMbuild"),
            _T("在指定目录中未发现可编译文件(*.c,*.cpp,*.asm或*.rc):%s"),
            g_Sys.Option.caSourcePath);
        return FALSE;
    }
    if ( !CreateMakefileFile(g_Sys.Option.caSourcePath) ){
        GetErrorMessage(caBuffer, MAX_STRING, GetLastError());
        MakeFileName(caFileName, g_Sys.Option.caSourcePath,

⌨️ 快捷键说明

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