wujiabao
驱动牛犊
驱动牛犊
  • 注册日期2006-05-16
  • 最后登录2009-05-08
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望16点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
阅读:1312回复:2

为什么我调用IoCreateDevice创建不一个磁盘?

楼主#
更多 发布于:2007-03-09 15:40
  为什么我调用IoCreateDevice创建不一个磁盘?

#include "precomp.h"
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath)
{
    ULONG ulDeviceNumber=0;
    NTSTATUS status;
    HANDLE Handle;



    status=CreateDevice(pDriverObject,ulDeviceNumber);

    if(!NT_SUCCESS(status))
    {
        DbgPrint("create device fail");
        return status;
    }
    pDriverObject->DriverUnload=DriverUnload;
    pDriverObject->MajorFunction[IRP_MJ_CREATE]=dispCreate;
    pDriverObject->MajorFunction[IRP_MJ_CLOSE]=dispClose;
    pDriverObject->MajorFunction[IRP_MJ_WRITE]=dispWrite;
    pDriverObject->MajorFunction[IRP_MJ_READ]=dispRead;    
    PsCreateSystemThread(&Handle,THREAD_ALL_ACCESS ,NULL, NULL, NULL,
            (PKSTART_ROUTINE)test, NULL);    

    return status;
}

void  test(void **arg)
{
    while(1)
    {
        DbgPrint("hello world!");
        NdisMSleep(5*1000000);
    }
}

NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject,IN ULONG ulDeviceNumber)
{
    NTSTATUS status;
    PDEVICE_OBJECT pDevObj;
    PDEVICE_EXTENSION pDevExt;
    OBJECT_ATTRIBUTES objattr;
    HANDLE dirhandle;
    PUNICODE_STRING pUniStr=CharToUnicode("\\Device");
    PUNICODE_STRING devname=CharToUnicode("\\Device\\RamDisk");

    DbgPrint("haha!I am runing!");
    NdisMSleep(5*1000000);

    InitializeObjectAttributes(&objattr,pUniStr,OBJ_PERMANENT,0,0);
    ZwCreateDirectoryObject(&dirhandle,DIRECTORY_ALL_ACCESS,&objattr);
    ZwMakeTemporaryObject(dirhandle);
    status=IoCreateDevice(pDriverObject,sizeof(DEVICE_EXTENSION),
                          devname,FILE_DEVICE_DISK,0,FALSE,&pDevObj);
    return status;
}

PUNICODE_STRING CharToUnicode(const char *str)
{
    ANSI_STRING AStr;
    PUNICODE_STRING pUStr;
    if(str==NULL)return NULL;
    pUStr=ExAllocatePool(NonPagedPool,sizeof(UNICODE_STRING));
    RtlInitAnsiString(&AStr,str);
    if(RtlAnsiStringToUnicodeString(pUStr,&AStr,TRUE)!=STATUS_SUCCESS)
        return NULL;
    return pUStr;
}


编译成helloWDM.sys
然后在注册表HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\中增加一个helloWDM项和三个键ErrorControl=1 , Start=2  和 Type=1 驱动程序正确启动,并每5秒钟
打印一次HELLO WORLD,但在EXPL0RER中就是看不到创建的虚盘
ymzh1982
驱动牛犊
驱动牛犊
  • 注册日期2005-05-08
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望40点
  • 贡献值0点
  • 好评度40点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-23 09:42
你有没有mount??
Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
板凳#
发布于:2007-03-27 21:41
代码不全阿。
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
游客

返回顶部