devicepath.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 1,127 行 · 第 1/2 页
C
1,127 行
{
USB_DEVICE_PATH *Usb;
Usb = DevPath;
CatPrint (Str, L"Usb(%x,%x)", Usb->ParentPortNumber, Usb->InterfaceNumber);
}
VOID
DevPathUsbClass (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
USB_CLASS_DEVICE_PATH *UsbClass;
UsbClass = DevPath;
CatPrint (
Str,
L"Usb Class(%x,%x,%x,%x,%x)",
UsbClass->VendorId,
UsbClass->ProductId,
UsbClass->DeviceClass,
UsbClass->DeviceSubClass,
UsbClass->DeviceProtocol
);
}
VOID
DevPathI2O (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
I2O_DEVICE_PATH *I2O;
I2O = DevPath;
CatPrint (Str, L"I2O(%x)", I2O->Tid);
}
VOID
DevPathMacAddr (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
MAC_ADDR_DEVICE_PATH *MAC;
UINTN HwAddressSize;
UINTN Index;
MAC = DevPath;
HwAddressSize = sizeof (EFI_MAC_ADDRESS);
if (MAC->IfType == 0x01 || MAC->IfType == 0x00) {
HwAddressSize = 6;
}
CatPrint (Str, L"Mac(");
for (Index = 0; Index < HwAddressSize; Index++) {
CatPrint (Str, L"%02x", MAC->MacAddress.Addr[Index]);
}
CatPrint (Str, L")");
}
VOID
DevPathIPv4 (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
IPv4_DEVICE_PATH *IP;
IP = DevPath;
CatPrint (
Str,
L"IPv4(%d.%d.%d.%d:%d)",
IP->RemoteIpAddress.Addr[0],
IP->RemoteIpAddress.Addr[1],
IP->RemoteIpAddress.Addr[2],
IP->RemoteIpAddress.Addr[3],
IP->RemotePort
);
}
VOID
DevPathIPv6 (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
IPv6_DEVICE_PATH *IP;
IP = DevPath;
CatPrint (Str, L"IP-v6(not-done)");
}
VOID
DevPathInfiniBand (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
INFINIBAND_DEVICE_PATH *InfiniBand;
InfiniBand = DevPath;
CatPrint (Str, L"InfiniBand(not-done)");
}
VOID
DevPathUart (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
UART_DEVICE_PATH *Uart;
CHAR8 Parity;
Uart = DevPath;
switch (Uart->Parity) {
case 0:
Parity = 'D';
break;
case 1:
Parity = 'N';
break;
case 2:
Parity = 'E';
break;
case 3:
Parity = 'O';
break;
case 4:
Parity = 'M';
break;
case 5:
Parity = 'S';
break;
default:
Parity = 'x';
break;
}
if (Uart->BaudRate == 0) {
CatPrint (Str, L"Uart(DEFAULT,%c,", Parity);
} else {
CatPrint (Str, L"Uart(%d,%c,", Uart->BaudRate, Parity);
}
if (Uart->DataBits == 0) {
CatPrint (Str, L"D,");
} else {
CatPrint (Str, L"%d,", Uart->DataBits);
}
switch (Uart->StopBits) {
case 0:
CatPrint (Str, L"D)");
break;
case 1:
CatPrint (Str, L"1)");
break;
case 2:
CatPrint (Str, L"1.5)");
break;
case 3:
CatPrint (Str, L"2)");
break;
default:
CatPrint (Str, L"x)");
break;
}
}
VOID
DevPathHardDrive (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
HARDDRIVE_DEVICE_PATH *Hd;
Hd = DevPath;
switch (Hd->SignatureType) {
case SIGNATURE_TYPE_MBR:
CatPrint (
Str,
L"HD(Part%d,Sig%08x)",
Hd->PartitionNumber,
*((UINT32 *) (&(Hd->Signature[0])))
);
break;
case SIGNATURE_TYPE_GUID:
CatPrint (
Str,
L"HD(Part%d,Sig%g)",
Hd->PartitionNumber,
(EFI_GUID *) &(Hd->Signature[0])
);
break;
default:
CatPrint (
Str,
L"HD(Part%d,MBRType=%02x,SigType=%02x)",
Hd->PartitionNumber,
Hd->MBRType,
Hd->SignatureType
);
break;
}
}
VOID
DevPathCDROM (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
CDROM_DEVICE_PATH *Cd;
Cd = DevPath;
CatPrint (Str, L"CDROM(Entry%x)", Cd->BootEntry);
}
VOID
DevPathFilePath (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
FILEPATH_DEVICE_PATH *Fp;
Fp = DevPath;
CatPrint (Str, L"%s", Fp->PathName);
}
VOID
DevPathMediaProtocol (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
MEDIA_PROTOCOL_DEVICE_PATH *MediaProt;
MediaProt = DevPath;
CatPrint (Str, L"%g", &MediaProt->Protocol);
}
VOID
DevPathFvFilePath (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFilePath;
FvFilePath = DevPath;
CatPrint (Str, L"%g", &FvFilePath->NameGuid);
}
VOID
DevPathBssBss (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
BBS_BBS_DEVICE_PATH *Bbs;
CHAR16 *Type;
Bbs = DevPath;
switch (Bbs->DeviceType) {
case BBS_TYPE_FLOPPY:
Type = L"Floppy";
break;
case BBS_TYPE_HARDDRIVE:
Type = L"Harddrive";
break;
case BBS_TYPE_CDROM:
Type = L"CDROM";
break;
case BBS_TYPE_PCMCIA:
Type = L"PCMCIA";
break;
case BBS_TYPE_USB:
Type = L"Usb";
break;
case BBS_TYPE_EMBEDDED_NETWORK:
Type = L"Net";
break;
default:
Type = L"?";
break;
}
//
// Since current Print function hasn't implemented %a (for ansi string)
// we will only print Unicode strings.
//
CatPrint (Str, L"Legacy-%s", Type);
}
VOID
DevPathEndInstance (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
CatPrint (Str, L",");
}
VOID
DevPathNodeUnknown (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
CatPrint (Str, L"?");
}
DEVICE_PATH_STRING_TABLE DevPathTable[] = {
HARDWARE_DEVICE_PATH,
HW_PCI_DP,
DevPathPci,
HARDWARE_DEVICE_PATH,
HW_PCCARD_DP,
DevPathPccard,
HARDWARE_DEVICE_PATH,
HW_MEMMAP_DP,
DevPathMemMap,
HARDWARE_DEVICE_PATH,
HW_VENDOR_DP,
DevPathVendor,
HARDWARE_DEVICE_PATH,
HW_CONTROLLER_DP,
DevPathController,
ACPI_DEVICE_PATH,
ACPI_DP,
DevPathAcpi,
ACPI_DEVICE_PATH,
ACPI_EXTENDED_DP,
DevPathExtendedAcpi,
ACPI_DEVICE_PATH,
ACPI_ADR_DP,
DevPathAdrAcpi,
MESSAGING_DEVICE_PATH,
MSG_ATAPI_DP,
DevPathAtapi,
MESSAGING_DEVICE_PATH,
MSG_SCSI_DP,
DevPathScsi,
MESSAGING_DEVICE_PATH,
MSG_FIBRECHANNEL_DP,
DevPathFibre,
MESSAGING_DEVICE_PATH,
MSG_1394_DP,
DevPath1394,
MESSAGING_DEVICE_PATH,
MSG_USB_DP,
DevPathUsb,
MESSAGING_DEVICE_PATH,
MSG_USB_CLASS_DP,
DevPathUsbClass,
MESSAGING_DEVICE_PATH,
MSG_I2O_DP,
DevPathI2O,
MESSAGING_DEVICE_PATH,
MSG_MAC_ADDR_DP,
DevPathMacAddr,
MESSAGING_DEVICE_PATH,
MSG_IPv4_DP,
DevPathIPv4,
MESSAGING_DEVICE_PATH,
MSG_IPv6_DP,
DevPathIPv6,
MESSAGING_DEVICE_PATH,
MSG_INFINIBAND_DP,
DevPathInfiniBand,
MESSAGING_DEVICE_PATH,
MSG_UART_DP,
DevPathUart,
MESSAGING_DEVICE_PATH,
MSG_VENDOR_DP,
DevPathVendor,
MEDIA_DEVICE_PATH,
MEDIA_HARDDRIVE_DP,
DevPathHardDrive,
MEDIA_DEVICE_PATH,
MEDIA_CDROM_DP,
DevPathCDROM,
MEDIA_DEVICE_PATH,
MEDIA_VENDOR_DP,
DevPathVendor,
MEDIA_DEVICE_PATH,
MEDIA_FILEPATH_DP,
DevPathFilePath,
MEDIA_DEVICE_PATH,
MEDIA_PROTOCOL_DP,
DevPathMediaProtocol,
#if (EFI_SPECIFICATION_VERSION < 0x00020000)
MEDIA_DEVICE_PATH,
MEDIA_FV_FILEPATH_DP,
DevPathFvFilePath,
#endif
BBS_DEVICE_PATH,
BBS_BBS_DP,
DevPathBssBss,
END_DEVICE_PATH_TYPE,
END_INSTANCE_DEVICE_PATH_SUBTYPE,
DevPathEndInstance,
0,
0,
NULL
};
CHAR16 *
DevicePathToStr (
IN EFI_DEVICE_PATH_PROTOCOL *DevPath
)
/*++
Turns the Device Path into a printable string. Allcoates
the string from pool. The caller must SafeFreePool the returned
string.
--*/
{
POOL_PRINT Str;
EFI_DEVICE_PATH_PROTOCOL *DevPathNode;
VOID (*DumpNode) (POOL_PRINT *, VOID *);
UINTN Index;
UINTN NewSize;
EfiZeroMem (&Str, sizeof (Str));
if (DevPath == NULL) {
goto Done;
}
//
// Unpacked the device path
//
DevPath = BdsLibUnpackDevicePath (DevPath);
ASSERT (DevPath);
//
// Process each device path node
//
DevPathNode = DevPath;
while (!IsDevicePathEnd (DevPathNode)) {
//
// Find the handler to dump this device path node
//
DumpNode = NULL;
for (Index = 0; DevPathTable[Index].Function; Index += 1) {
if (DevicePathType (DevPathNode) == DevPathTable[Index].Type &&
DevicePathSubType (DevPathNode) == DevPathTable[Index].SubType
) {
DumpNode = DevPathTable[Index].Function;
break;
}
}
//
// If not found, use a generic function
//
if (!DumpNode) {
DumpNode = DevPathNodeUnknown;
}
//
// Put a path seperator in if needed
//
if (Str.len && DumpNode != DevPathEndInstance) {
CatPrint (&Str, L"/");
}
//
// Print this node of the device path
//
DumpNode (&Str, DevPathNode);
//
// Next device path node
//
DevPathNode = NextDevicePathNode (DevPathNode);
}
//
// Shrink pool used for string allocation
//
gBS->FreePool (DevPath);
Done:
NewSize = (Str.len + 1) * sizeof (CHAR16);
Str.str = ReallocatePool (Str.str, NewSize, NewSize);
ASSERT (Str.str != NULL);
Str.str[Str.len] = 0;
return Str.str;
}
EFI_DEVICE_PATH_PROTOCOL *
LibDuplicateDevicePathInstance (
IN EFI_DEVICE_PATH_PROTOCOL *DevPath
)
/*++
Routine Description:
Function creates a device path data structure that identically matches the
device path passed in.
Arguments:
DevPath - A pointer to a device path data structure.
Returns:
The new copy of DevPath is created to identically match the input.
Otherwise, NULL is returned.
--*/
{
EFI_DEVICE_PATH_PROTOCOL *NewDevPath;
EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;
EFI_DEVICE_PATH_PROTOCOL *Temp;
UINTN Size;
//
// get the size of an instance from the input
//
Temp = DevPath;
DevicePathInst = EfiDevicePathInstance (&Temp, &Size);
//
// Make a copy
//
NewDevPath = NULL;
if (Size) {
NewDevPath = EfiLibAllocateZeroPool (Size);
ASSERT (NewDevPath != NULL);
}
if (NewDevPath) {
EfiCopyMem (NewDevPath, DevicePathInst, Size);
}
return NewDevPath;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?