关于动态加载/卸载驱动

这是,InstDriver的例子,好像是《UndocumentNT》中的。 
#include /"stdafx.h/" 
#include /"winsvc.h/" 
BOOL InstallDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName, IN LPCTSTR ServiceExe ); 
BOOL StartDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName ); 
BOOL OpenDevice( IN LPCTSTR DriverName, HANDLE * lphDevice ); 
BOOL StopDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName ); BOOL RemoveDriver( IN SC_HANDLE                                                           SchSCManager, IN LPCTSTR DriverName ); /**************************************************************************** * * 
FUNCTION: LoadDeviceDriver( const TCHAR, const TCHAR, HANDLE *) * * 
PURPOSE: Registers a driver with the system configuration manager * and then loads it. *
****************************************************************************/ 
BOOL LoadDeviceDriver( const TCHAR * Name, const TCHAR * Path, HANDLE * lphDevice ) 
    SC_HANDLE schSCManager; BOOL okay; 
    schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL _ACCESS ); 
    // Ignore success of installation: it may already be installed. InstallDriver( schSCManager, Name, Path );
    // Ignore success of start: it may already be started. StartDriver( schSCManager, Name ); 
    // Do make sure we can open it. 
    okay = OpenDevice( Name, lphDevice ); 
    CloseServiceHandle( schSCManager ); 
    return okay; 
/**************************************************************************** * * 
FUNCTION: InstallDriver( IN SC_HANDLE, IN LPCTSTR, IN LPCTSTR) * * 
PURPOSE: Creates a driver service. * ****************************************************************************/ 
BOOL InstallDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName, IN LPCTSTR ServiceExe ) 
    SC_HANDLE schService; 
    // NOTE: This creates an entry for a standalone driver. If this 
    // is modified for use with a driver that requires a Tag, 
    // Group, and/or Dependencies, it may be necessary to 
    // query the registry for existing driver information 
    // (in order to determine a unique Tag, etc.). 
    // schService = CreateService( SchSCManager, 
    // SCManager database DriverName, 
    // name of service DriverName, 
    // name to display SERVICE_ALL_ACCESS, 
    // desired access SERVICE_KERNEL_DRIVER, 
    // service type SERVICE_DEMAND_START, 
    // start type SERVICE_ERROR_NORMAL, 
    // error control type ServiceExe, 
    // service/'s binary NULL, 
    // no load ordering group NULL, 
    // no tag identifier NULL, 
    // no dependencies NULL, 
    // LocalSystem account NULL 
    // no password ); 
    if ( schService == NULL ) 
        return FALSE; 
    CloseServiceHandle( schService ); 
    return TRUE; 
/**************************************************************************** * * 
FUNCTION: StartDriver( IN SC_HANDLE, IN LPCTSTR) * *
 PURPOSE: Starts the driver service. * ****************************************************************************/ 
BOOL StartDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName ) 
    SC_HANDLE schService; 
    BOOL ret; 
    schService = OpenService( SchSCManager, DriverName, SERVICE_ALL_ACCESS ); 
    if ( schService == NULL ) 
            return FALSE; 
    ret = StartService( schService, 0, NULL ) || GetLastError() == ERROR_SERVICE_ALREADY_RUNNING;
    CloseServiceHandle( schService ); 
    return ret;
/**************************************************************************** * * 
FUNCTION: OpenDevice( IN LPCTSTR, HANDLE *) * * 
PURPOSE: Opens the device and returns a handle if desired. * ****************************************************************************/ 
BOOL OpenDevice( IN LPCTSTR DriverName, HANDLE * lphDevice ) 
    TCHAR completeDeviceName[64]; HANDLE hDevice; 
    // // Create a .//XXX device name that CreateFile can use 
    // // NOTE: We/'re making an assumption here that the driver 
    // has created a symbolic link using it/'s own name 
    // (i.e. if the driver has the name /"XXX/" we assume 
    // that it used IoCreateSymbolicLink to create a 
    // symbolic link /"//DosDevices//XXX/". Usually, there 
    // is this understanding between related apps/drivers. 
    // // An application might also peruse the DEVICEMAP 
    // section of the registry, or use the QueryDosDevice 
    // API to enumerate the existing symbolic links in the 
    // system. 
    // wsprintf( completeDeviceName, TEXT(/".%s/"), DriverName ); 
    hDevice = CreateFile( completeDeviceName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,                     FILE_ATTRIBUTE_NORMAL, NULL); 
    if ( hDevice == ((HANDLE)-1) ) 
        return FALSE; 
    // If user wants handle, give it to them. Otherwise, just close it. 
    if ( lphDevice ) 
        *lphDevice = hDevice; 
    else CloseHandle( hDevice ); 
        return TRUE; 
/**************************************************************************** * * 
FUNCTION: UnloadDeviceDriver( const TCHAR *) * * 
PURPOSE: Stops the driver and has the configuration manager unload it. * ****************************************************************************/ 
BOOL UnloadDeviceDriver( const TCHAR * Name ) 
    SC_HANDLE schSCManager; 
    schSCManager = OpenSCManager( NULL, // machine (NULL == local) 
            NULL, // database (NULL == default)
             SC_MANAGER_ALL_ACCESS // access required); 
    StopDriver( schSCManager, Name ); 
    RemoveDriver( schSCManager, Name ); 
    CloseServiceHandle( schSCManager ); 
    return TRUE; 
/**************************************************************************** * * 
FUNCTION: StopDriver( IN SC_HANDLE, IN LPCTSTR) *
* PURPOSE: Has the configuration manager stop the driver (unload it) * ****************************************************************************/ 
BOOL StopDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName ) 
    SC_HANDLE schService; 
    BOOL ret; 
    SERVICE_STATUS serviceStatus; 
    schService = OpenService( SchSCManager, DriverName, SERVICE_ALL_ACCESS ); 
    if ( schService == NULL ) 
        return FALSE; 
    ret = ControlService( schService, SERVICE_CONTROL_STOP, &serviceStatus ); 
    CloseServiceHandle( schService ); 
    return ret; 
/**************************************************************************** * * 
FUNCTION: RemoveDriver( IN SC_HANDLE, IN LPCTSTR) * * 
PURPOSE: Deletes the driver service. * ****************************************************************************/ 
BOOL RemoveDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName ) 
    SC_HANDLE schService; 
    BOOL ret; 
    schService = OpenService( SchSCManager, DriverName, SERVICE_ALL_ACCESS ); 
    if ( schService == NULL ) 
    return FALSE; 
    ret = DeleteService( schService ); 
    CloseServiceHandle( schService );
    return ret; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值