如何在EDK2 tianocore中打开物理磁盘?

时间:2017-06-16 16:24:28

标签: c uefi

我是EDK2 tianocore的初学者。

我有EFI Shell,我想用EFI Shell打开当前的USB作为物理磁盘来读写块。在WinAPI中,我知道CreateFile函数的参数类似于“\\。\ D:”,ReadFileWriteFile

EDK2的类似物是什么?你能举例和一些有用的链接吗?

UPD 30.06.2017。

我正在尝试使用EFI_USB_IO_PROTOCOL来通过USB闪存获得比EFI_BLOCK_IO_PROTOCOL更快的IO操作。

我有这样的代码:

EFI_STATUS
USBXYZDriverBindingSupported (
 IN EFI_HANDLE Controller,
 IN EFI_DEVICE_PATH *RemainingDevicePath
 )
{
     UINT32 *OpenStatus= NULL;
     EFI_USB_IO_PROTOCOL *UsbIo;
     EFI_STATUS Status;
     EFI_USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
     CHAR16 *DevStr = NULL;
     DevStr = DevicePathToStr(RemainingDevicePath);
     //
     // Check if USB_IO protocol is attached on the controller handle.
     //
     Status = BS->OpenProtocol (
         Controller,
         &gEfiUsbIoProtocolGuid,
         (VOID**)&UsbIo,
         gImgHandle,
         Controller,
         EFI_OPEN_PROTOCOL_GET_PROTOCOL
         );

     if (EFI_ERROR (Status)) {
         return Status;
     }

     //
     // Get the default interface descriptor
     //
     Status = UsbIo->UsbGetInterfaceDescriptor(
         UsbIo,
         &InterfaceDescriptor
     );
     Print(L"%a.%d %r %s\n", __FUNCTION__, __LINE__, Status, DevStr);

     UINTN a = 512;
     UINTN *byteSize = &a;
     char *buf = AllocateZeroPool(512);
     Status = UsbIo->UsbBulkTransfer(UsbIo, 0x82, buf, byteSize, 0, OpenStatus);

     Print(L"%a.%d %r %d %d\n", __FUNCTION__, __LINE__, Status,OpenStatus, *byteSize);


     BS->CloseProtocol (
         Controller,
         &gEfiUsbIoProtocolGuid,
         gImgHandle,
         Controller
         );
     return Status;
} 

我只有一台设备才能获得成功的OpenProtocol输出。比我试图从USB读取前512个字节。 但是,函数UsbBulkTransfer失败。

输出:

  

USBXYZDriverBindingSupported.196成功   PciRoot(0)/ Pci(0x14,0x0)/ Usb(0x1,0x0)USBXYZDriverBindingSupported.203   无效的Parametr 0 512

read表示EFI_INVALID_PARAMETER因为:

Data is NULL - 不是我的选择。我正在尝试读取数据。

DataLength is NULL. - 不是我的选择。长度是512。

If DeviceEndpoint is not valid. - 可能的原因。如何知道DeviceEndpoint的含义?如何获取,计算,使用它?

我还尝试使用OpenProtocolEFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL。什么都没有改变。

如何使用UsbBulkTransfer读取数据?我的错是什么?

谢谢。

0 个答案:

没有答案