zoukankan      html  css  js  c++  java
  • 加载驱动程序

    一个KMD都需要创建设备和符号链接,它们分别为kernel和win32提供了名字,这样kernel和win32就可以正确地使用KMD
    相关例程 IoCreateDevice IoDeleteDevice IoCreateSymbolicLink IoDeleteSymbolicLink 查阅DDK文档


    /*
    driver.c
    */
    #include <ntddk.h>
    
    #define FILE_DEVICE_HELLO 0x00008010
    
    /*函数声明*/
    VOID DriverUnload(PDRIVER_OBJECT DriverObject);
    /*DriverEntry例程*/
    NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
    {
        UNICODE_STRING  DeviceNameUnicodeString;
        UNICODE_STRING  DeviceLinkUnicodeString;
        NTSTATUS        ntStatus;
        PDEVICE_OBJECT  DeviceObject = NULL;
    
    
        RtlInitUnicodeString (&DeviceNameUnicodeString, L"\\Device\\dload");    
        
        /*创建设备*/
        ntStatus = IoCreateDevice (DriverObject,
                                    0,
                                    &DeviceNameUnicodeString,
                                    FILE_DEVICE_HELLO,
                                    0,
                                    TRUE,
                                    &DeviceObject);
    
        if (NT_SUCCESS(ntStatus))
        {
            /*卸载例程*/
            DriverObject->DriverUnload                         = DriverUnload;
    
            /*创建符号链接*/
            RtlInitUnicodeString (&DeviceLinkUnicodeString, L"\\DosDevices\\dload");
            ntStatus = IoCreateSymbolicLink (&DeviceLinkUnicodeString,&DeviceNameUnicodeString);
    
            if (!NT_SUCCESS(ntStatus))
            {
                DbgPrint ("ERROR: IoCreateSymbolicLink failed");
                IoDeleteDevice (DeviceObject);
            }
        }
        else
        {
            DbgPrint ("ERROR: IoCreateDevice failed");
        }
    
        DbgPrint("dload");
    
        return ntStatus;
    
    }
    /*DriverUnload*/
    VOID DriverUnload(PDRIVER_OBJECT DriverObject)
    {
        UNICODE_STRING DeviceLinkUnicodeString;
        NTSTATUS ntStatus;
    
    
        RtlInitUnicodeString (&DeviceLinkUnicodeString, L"\\DosDevices\\dload");
        
        ntStatus = IoDeleteSymbolicLink (&DeviceLinkUnicodeString);
    
        if (NT_SUCCESS(ntStatus))
        {
            IoDeleteDevice (DriverObject->DeviceObject);
        }
        else
        {
            DbgPrint ("ERROR: IoDeleteSymbolicLink");
        }
    
    }
    
    
    #include <windows.h> #include <Winsvc.h> #include <stdio.h> int main() { SC_HANDLE hSrvMgr; /*服务管理器句柄*/ SC_HANDLE hSrvDrv;/*KMD服务名柄*/ SERVICE_STATUS SvrSta; char szDir[256]; DWORD dwSize; GetCurrentDirectory( dwSize, szDir );/*取当前目录 */ strcat(szDir,"\\dload.sys"); LPCTSTR lpszBinaryPathName=TEXT(szDir); puts("任意键开始"); getchar(); hSrvMgr=OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); //打开服务控制管理器 if(hSrvMgr) { puts("打开服务管理器:成功!"); } else { puts("打开服务管理器:失败,任意键退出"); getchar(); exit(1); } puts("任意键继续"); getchar(); hSrvDrv= CreateService( hSrvMgr, TEXT("dload"), //SYSTEM\CurrentControlSet\Services 驱动程序的在注册表中的名字 TEXT("dload"), // 注册表驱动程序的 DisplayName 值 SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限 SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序 SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值 SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值 lpszBinaryPathName, // 注册表驱动程序的 ImagePath 值 NULL, NULL, NULL, NULL, NULL); if(hSrvDrv) { puts("服务创建:成功!"); } else { puts("服务创建:失败,任意键退出"); getchar(); exit(1); } puts("任意键继续"); getchar(); if(StartService( hSrvDrv, NULL, NULL )) { puts("服务启动:成功,KMD加载成功"); } else { puts("服务启动:失败,任意键退出"); getchar(); exit(1); } puts("任意键继续"); getchar(); if( ControlService(hSrvDrv, SERVICE_CONTROL_STOP , &SvrSta ) ) { puts("服务停止:成功,KMD不工作"); } else { puts("服务停止:失败,需要重启再次加载,任意键退出"); getchar(); exit(1); } puts("任意键继续"); getchar(); if( DeleteService( hSrvDrv ) ) { puts("服务卸载:成功"); } else { puts("服务卸载:失败,任意键退出"); getchar(); exit(1); } CloseServiceHandle( hSrvDrv ); CloseServiceHandle( hSrvMgr ); puts("任意键退出"); getchar(); return 0; }
  • 相关阅读:
    Poj(1703),种类并查集
    Poj(2236),简单并查集
    Poj (3239),m皇后问题
    Poj(1521),哈夫曼编码
    NYOJ(680),摘枇杷,(暴力,或者二分搜索)
    NYOJ(42)欧拉图
    数集合有多少个TOJ(2469)
    HDU(1016),打素数环
    HDU(4394),数论上的BFS
    Poj(2225),三维BFS
  • 原文地址:https://www.cnblogs.com/iwasmu/p/1491796.html
Copyright © 2011-2022 走看看