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

📄 loadsys.c

📁 加载驱动程序的一个例程
💻 C
字号:
/*================================
  LoadSys.c   VC 6.0
  by:xuezhimeng -- 2008-08-16
================================*/
#include <windows.h>
#include <commdlg.h>
#include <Shellapi.h>
#include "resource.h"

BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;
BOOL operaType(TCHAR *szFullPath, TCHAR *szName, int iType) ;
void PopFileInitialize (HWND, OPENFILENAME *) ;
BOOL PopFileOpenDlg (HWND, OPENFILENAME *, PTSTR, PTSTR) ;

TCHAR szAppName [] = TEXT ("LoadSys") ;
HWND hwndStatus = NULL ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
	if (-1 == DialogBox (hInstance, szAppName, NULL, DlgProc))
	{
		MessageBox (NULL, TEXT ("This program requires Windows NT!"),
			szAppName, MB_ICONERROR) ;
	}
	return 0 ;
}

BOOL CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static OPENFILENAME ofn ;
	static HWND hwndDrvPath = NULL ;
	static TCHAR szFullPath[MAX_PATH]={0}, szTitle[MAX_PATH]={0} ;
	HDROP hDrop = NULL ;
	int iOperaType = 0 ;
	TCHAR *pStr = NULL ;

	switch (message)
	{
	case WM_INITDIALOG:
		hwndDrvPath = GetDlgItem(hwnd, IDC_EDIT_DRVFULLPATH) ;
		hwndStatus  = GetDlgItem(hwnd, IDC_STATIC_STATUS) ;
		DragAcceptFiles(hwnd, TRUE) ; //使窗口支持文件拖拽的功能
		PopFileInitialize (hwnd, &ofn) ; //初始化打开文件对话框
		return FALSE ;

	case WM_DROPFILES:
		hDrop = (HDROP)wParam ;
		DragQueryFile(hDrop, 0, szFullPath, MAX_PATH) ; //这里我们只支持一个文件
		SetDlgItemText(hwnd, IDC_EDIT_DRVFULLPATH, szFullPath) ;
		return 0 ;
		
	case WM_COMMAND:
		switch (LOWORD (wParam)) //LOWORD(wParam)是控件的ID 高字组是通知码
		{
		case IDOK:
			//EndDialog (hwnd, 1) ;
			break ;
			
		case IDCANCEL:
			EndDialog (hwnd, 0) ;
			break ;

		case IDC_BTN_BROWSE: //浏览按钮
			if(PopFileOpenDlg(hwnd, &ofn, szFullPath, szTitle))
				SetDlgItemText(hwnd, IDC_EDIT_DRVFULLPATH, szFullPath) ;
			break ;

		case IDC_BTN_INSTALL: //安装按钮
		case IDC_BTN_START:   //开始按钮
		case IDC_BTN_STOP:    //停止按钮
		case IDC_BTN_REMOVE:  //移除按钮
			GetDlgItemText(hwnd, IDC_EDIT_DRVFULLPATH, szFullPath, MAX_PATH) ;
			pStr = szFullPath + lstrlen(szFullPath) ;
			while(*pStr != '\\' && pStr-szFullPath!=0)
				pStr-- ;
			if(pStr != szFullPath)
				pStr++ ;
			//_tcsncpy(szTitle, pStr, MAX_PATH) ;
			for(iOperaType=0; *(pStr+iOperaType); iOperaType++)
				szTitle[iOperaType] = *(pStr+iOperaType) ;
			szTitle[iOperaType] = '\0' ;
			switch(LOWORD (wParam))
			{
			case IDC_BTN_INSTALL:
				iOperaType = 0 ;
				break ;

			case IDC_BTN_START:
				iOperaType = 1 ;
				break ;

			case IDC_BTN_STOP:
				iOperaType = 2 ;
				break ;

			case IDC_BTN_REMOVE:
				iOperaType = 3 ;
				break ;
			}
			operaType(szFullPath, szTitle, iOperaType) ;
			break ;
		}
		return TRUE ;
		
		case WM_SYSCOMMAND:
			switch (LOWORD (wParam))
			{
			case SC_CLOSE:
				EndDialog (hwnd, 0) ;		   
				return TRUE ;
			}
			break ;
	}
	return FALSE ;
}

BOOL operaType(TCHAR *szFullPath, TCHAR *szName, int iType)
{
	SC_HANDLE shOSCM = NULL, shCS = NULL ;
	SERVICE_STATUS ss ;
	DWORD dwErrorCode = 0 ;
	BOOL bSuccess = FALSE ;

	shOSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	if( !shOSCM )
	{
		SetWindowText(hwndStatus, TEXT("OpenSCManager时出错!")) ;
		return FALSE ;
	}

	if(iType) //若操作类型不为 安装服务
	{
	    shCS = OpenService(shOSCM, szName, SERVICE_ALL_ACCESS) ;
	    if( !shCS )
	    {
		dwErrorCode = GetLastError() ; //获取错误信息
		if(ERROR_INVALID_NAME == dwErrorCode)
			SetWindowText(hwndStatus, TEXT("服务名无效!")) ;
		else if(ERROR_SERVICE_DOES_NOT_EXIST == dwErrorCode)
			SetWindowText(hwndStatus, TEXT("不存在此服务!")) ;
		else
			SetWindowText(hwndStatus, TEXT("OpenService时出错!")) ;
		CloseServiceHandle(shOSCM); //关闭服务句柄
		shOSCM = NULL ;
		return FALSE;
	    }
	}

	switch(iType)
	{
	case 0: //安装服务
	    shCS = CreateService(shOSCM, szName, szName,
		SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,
		SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
		szFullPath, NULL, NULL, NULL, NULL, NULL) ;

	    if( !shCS )
	    {
		if(ERROR_SERVICE_EXISTS == GetLastError()) //如果服务已经存在
			SetWindowText(hwndStatus, TEXT("指定的服务已经存在!")) ;	
		else
			SetWindowText(hwndStatus, TEXT("CreateService时出错!")) ;
		bSuccess = FALSE ;
		break ;
	    }
	    bSuccess = TRUE ;
	    SetWindowText(hwndStatus, TEXT("安装服务成功!")) ;
	    break ;

	case 1: //运行服务
	    if(StartService(shCS, 0, NULL))
		SetWindowText(hwndStatus, TEXT("运行指定服务成功!")) ;
	    else
	    {
		dwErrorCode = GetLastError() ;
		if(ERROR_SERVICE_ALREADY_RUNNING == dwErrorCode)
			SetWindowText(hwndStatus, TEXT("指定的服务已经运行!")) ;
		else
			SetWindowText(hwndStatus, TEXT("运行指定服务出错!")) ;
		bSuccess = FALSE ;
		break ;
	    }
	    bSuccess = TRUE ;
	    break ;

	case 2: //停止服务
		if(!ControlService(shCS, SERVICE_CONTROL_STOP, &ss))
		{
			dwErrorCode = GetLastError() ;
			if(ERROR_SERVICE_NOT_ACTIVE == dwErrorCode)
				SetWindowText(hwndStatus, TEXT("指定的服务并未启动!")) ;
			else
				SetWindowText(hwndStatus, TEXT("不能停止服务!")) ;
			bSuccess = FALSE ;
			break ;
	    }
	    SetWindowText(hwndStatus, TEXT("成功停止服务!")) ;
	    bSuccess = TRUE ;
	    break ;

	case 3: //移除服务
	    if(!DeleteService(shCS))
	    {
			SetWindowText(hwndStatus, TEXT("不能移除服务!")) ;
			bSuccess = FALSE ;
			break ;
	    }
	    SetWindowText(hwndStatus, TEXT("成功移除服务!")) ;
	    bSuccess = TRUE ;
	    break ;
	    
	default:
	    break ;
	}

	if(shCS)
	{
		CloseServiceHandle(shCS) ;
		shCS = NULL ;
	}
	if(shOSCM)
	{
		CloseServiceHandle(shOSCM) ;
		shOSCM = NULL ;
	}

	return bSuccess ;
}

void PopFileInitialize (HWND hwnd, OPENFILENAME *pOfn)
{
	static TCHAR szFilter[] = TEXT ("Sys Files (*.sys)\0*.sys\0")  \
		TEXT ("All Files (*.*)\0*.*\0\0") ;
	
	pOfn->lStructSize       = sizeof (OPENFILENAME) ;
	pOfn->hwndOwner         = hwnd ;
	pOfn->hInstance         = NULL ;
	pOfn->lpstrFilter       = szFilter ; //文件类型
	pOfn->lpstrCustomFilter = NULL ;
	pOfn->nMaxCustFilter    = 0 ;
	pOfn->nFilterIndex      = 0 ;
	pOfn->lpstrFile         = NULL ;          // Set in Open and Close functions
	pOfn->nMaxFile          = MAX_PATH ;
	pOfn->lpstrFileTitle    = NULL ;          // Set in Open and Close functions
	pOfn->nMaxFileTitle     = MAX_PATH ;
	pOfn->lpstrInitialDir   = NULL ;
	pOfn->lpstrTitle        = NULL ;
	pOfn->Flags             = 0 ;             // Set in Open and Close functions
	pOfn->nFileOffset       = 0 ;
	pOfn->nFileExtension    = 0 ;
	pOfn->lpstrDefExt       = TEXT ("sys") ;
	pOfn->lCustData         = 0L ;
	pOfn->lpfnHook          = NULL ;
	pOfn->lpTemplateName    = NULL ;
}

BOOL PopFileOpenDlg (HWND hwnd, OPENFILENAME *pOfn, PTSTR pstrFileName, PTSTR pstrTitleName)
{
	pOfn->hwndOwner         = hwnd ;
	pOfn->lpstrFile         = pstrFileName ;
	pOfn->lpstrFileTitle    = pstrTitleName ;
	pOfn->Flags             = OFN_FILEMUSTEXIST ; //文件必须存在的
	
	return GetOpenFileName (pOfn) ;
}

⌨️ 快捷键说明

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