lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
阅读:1408回复:0

sfilter!SfCreate: SfVolumeDeviceNameToDosName(81859690) failed(c0000001)

楼主#
更多 发布于:2007-03-20 10:10
运行环境:2000 pro + VM
在windbg下调试
 错误信息:
sfilter!SfCreate: SfVolumeDeviceNameToDosName(81859690) failed(c0000001)
相关代码如下,请问是哪里出错了?
谢谢!!
SfCreate
{
....
if (DevExt->DriveLetter == L'\0') {

        UNICODE_STRING DosName;

        Status = SfVolumeDeviceNameToDosName(&DevExt->DeviceName, &DosName);
        if (NT_SUCCESS(Status)) {

            DevExt->DriveLetter = DosName.Buffer[0];
            ExFreePool(DosName.Buffer);
    
            if ((DevExt->DriveLetter >= L'a') && (DevExt->DriveLetter <= L'z')) {
                DevExt->DriveLetter += L'A' - L'a';
            }
        } else {
            KdPrint(("sfilter!SfCreate: SfVolumeDeviceNameToDosName(%x) failed(%x)\n",
                DevExt->StorageStackDeviceObject, Status));
        }
    }

 ....
}

NTSTATUS
SfVolumeDeviceNameToDosName(
    IN PUNICODE_STRING VolumeDeviceName,
    OUT PUNICODE_STRING DosName
    )
/*++

Routine Description:

    This routine returns a valid DOS path for the given device object.
    This caller of this routine must call ExFreePool on DosName->Buffer
    when it is no longer needed.

Arguments:

    VolumeDeviceName    - Supplies the volume device object.

    DosName             - Returns the DOS name for the volume

Return Value:

    NTSTATUS

--*/

{
    WCHAR Buffer[30];
    UNICODE_STRING DriveLetterName;
    UNICODE_STRING LinkTarget;
    WCHAR Char;
    NTSTATUS Status;

    swprintf(Buffer, L"\\??\\C:");
    RtlInitUnicodeString(&DriveLetterName, Buffer);

    for (Char = 'A'; Char <= 'Z'; Char++)
    {
        DriveLetterName.Buffer[4] = Char;

        Status = SfQuerySymbolicLink(&DriveLetterName, &LinkTarget);
        if (!NT_SUCCESS(Status))
            continue;

        if (RtlEqualUnicodeString(&LinkTarget, VolumeDeviceName, TRUE))
        {
            ExFreePool(LinkTarget.Buffer);
            break;
        }

        ExFreePool(LinkTarget.Buffer);
    }

    if (Char <= 'Z')
    {
        DosName->Buffer = ExAllocatePool(PagedPool, 3*sizeof(WCHAR));
        if (!DosName->Buffer)
            return STATUS_INSUFFICIENT_RESOURCES;

        DosName->MaximumLength = 6;
        DosName->Length = 4;
        DosName->Buffer[0] = Char;
        DosName->Buffer[1] = ':';
        DosName->Buffer[2] = 0;

        return STATUS_SUCCESS;
    }

    return STATUS_UNSUCCESSFUL;
}
游客

返回顶部