加载驱动程序

一个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;
}

转载于:https://www.cnblogs.com/iwasmu/archive/2009/05/29/1491796.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值