加载驱动程序

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

posted on 2009-05-29 19:03  devcfei  阅读(2201)  评论(0编辑  收藏  举报