阅读:1408回复:0
sfilter!SfCreate: SfVolumeDeviceNameToDosName(81859690) failed(c0000001)
运行环境: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; } |
|