boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
阅读:1280回复:4

CreateFile创建文件设备蓝屏

楼主#
更多 发布于:2007-08-29 21:49
用户模式下的代码
    CHAR DriverName[256];
    CHAR DeviceName[] = "HideFileService";
    CHAR DevicePath[] = "\\\\.\\SFilter";

    HANDLE hDevice = CreateFile(DevicePath,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if (INVALID_HANDLE_VALUE == hDevice)
    {
        printf("%s Device Failed Error Code:[%08x]\n", DevicePath, GetLastError());
    }
    else
    {
        CloseHandle(hDevice);
    }

为什么我一运行就蓝屏啊!!!
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
沙发#
发布于:2007-08-30 08:49
You have a buggy driver. Check CREATE IRP routines.
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-08-30 08:51
NTSTATUS
FsDeviceCreate(IN PDEVICE_OBJECT DeviceObject,
               IN PIRP Irp)
{
    if (g_CDO == DeviceObject)
    {
        KdPrint(("CDO Created!\n"));
        Irp->IoStatus.Information = 0;
        Irp->IoStatus.Status = STATUS_SUCCESS;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        __asm int 3;
        return STATUS_SUCCESS;
    }
    KdPrint(("HOOK IRP_CREATE\n"));
    return SfPassThrough(DeviceObject, Irp);
}
SoftICE提示成功的执行到了__asm int 3;
但是还是错误啊,michaelgz,你帮我看看吧
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
地板#
发布于:2007-08-30 10:15
呵呵 SoftICE发现了bug
NTSTATUS
SfPassThrough(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);
    //不处理
    //ASSERT(IS_MY_DEVICE_OBJECT(DeviceObject));
    if (g_CDO == DeviceObject)
    {
        KdPrint((("ERROR CDO:[%08x]\n"), irpSp->MajorFunction, irpSp->MinorFunction));
        _asm int 3;

        Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
        Irp->IoStatus.Information = 0;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return STATUS_INVALID_DEVICE_REQUEST;
    }
    IoSkipCurrentIrpStackLocation(Irp);
    return IoCallDriver(((PDEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDevice, Irp);
}

ICE中断显示Error CDO [00000012]
查00000012得到:IRP_MJ_CLEANUP,原来是我没有设置IRP_MJ_CLEANUP的处理函数
导致直接使用SfPassThrough,而CDO没有AttachedToDevice,导致蓝屏
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2007-08-30 10:20
郁闷啊 不是有IRP_MJ_CLOSE了吗
MS还发一个IRP_MJ_CLEANUP给我干什么啊,害我从昨天下午郁闷到现在,还好我从小就养成了良好的调试习惯,哈哈
游客

返回顶部