windows-nt/Source/XPSP1/NT/base/efiutil/sdk/shell/shellenv/dprot.c
2020-09-26 16:20:57 +08:00

371 lines
9.3 KiB
C

/*++
Copyright (c) 1998 Intel Corporation
Module Name:
dprot.c
Abstract:
Shell environment - dump protocol functions for the "dh" command
Revision History
--*/
#include "shelle.h"
STATIC CHAR16 *SEnvDP_IlleagalStr[] = {
L"Illegal"
};
STATIC CHAR16 *SEnvDP_HardwareStr[] = {
L"Illegal", L"PCI", L"PCCARD", L"MemMap", L"VENDOR"
};
STATIC CHAR16 *SEnvDP_PnP_Str[] = {
L"Illegal", L"PnP"
};
STATIC CHAR16 *SEnvDP_MessageStr[] = {
L"Illegal", L"ATAPI", L"SCSI", L"FIBRE Channel",
L"1394", L"USB", L"I2O", L"TCP/IPv4", L"TCP/IPv6",
L"NGIO", L"VENDOR"
};
STATIC CHAR16 *SEnvDP_MediaStr[] = {
L"Illegal", L"Hard Drive", L"CD-ROM", L"VENDOR", L"File Path", L"Media Protocol"
};
STATIC CHAR16 *SEnvDP_BBS_Str[] = {
L"Illegal", L"BBS"
};
struct DevicePathTypes {
UINT8 Type;
UINT8 MaxSubType;
CHAR16 *TypeString;
CHAR16 **SubTypeStr;
VOID (*Function)(EFI_DEVICE_PATH *);
};
VOID
SEnvHardwareDevicePathEntry (
IN EFI_DEVICE_PATH *DevicePath
)
{
VENDOR_DEVICE_PATH *VendorDevicePath;
if (DevicePathType(DevicePath) != HW_PCI_DP) {
return;
}
if (DevicePathSubType(DevicePath) == HW_VENDOR_DP) {
VendorDevicePath = (VENDOR_DEVICE_PATH *)DevicePath;
Print(L"\n%N Guid %g",
&VendorDevicePath->Guid
);
}
}
VOID
SEnvPnpDevicePathEntry (
IN EFI_DEVICE_PATH *DevicePath
)
{
ACPI_HID_DEVICE_PATH *AcpiDevicePath;
if (DevicePathType(DevicePath) != ACPI_DEVICE_PATH) {
return;
}
if (DevicePathSubType(DevicePath) == ACPI_DP) {
AcpiDevicePath = (ACPI_HID_DEVICE_PATH *)DevicePath;
Print(L"\n%N HID %x, UID %x",
AcpiDevicePath->HID,
AcpiDevicePath->UID
);
}
}
VOID
SEnvMediaDevicePathEntry (
IN EFI_DEVICE_PATH *DevicePath
)
{
HARDDRIVE_DEVICE_PATH *HardDriveDevicePath;
CDROM_DEVICE_PATH *CDDevicePath;
VENDOR_DEVICE_PATH *VendorDevicePath;
FILEPATH_DEVICE_PATH *FilePath;
MEDIA_PROTOCOL_DEVICE_PATH *MediaProtocol;
if (DevicePathType(DevicePath) != MEDIA_DEVICE_PATH) {
return;
}
switch (DevicePathSubType(DevicePath)) {
case MEDIA_HARDDRIVE_DP:
HardDriveDevicePath = (HARDDRIVE_DEVICE_PATH *)DevicePath;
Print(L"\n%N Partition (%d) Start (%lX) Size (%lX)",
HardDriveDevicePath->PartitionNumber,
HardDriveDevicePath->PartitionStart,
HardDriveDevicePath->PartitionSize
);
break;
case MEDIA_CDROM_DP:
CDDevicePath = (CDROM_DEVICE_PATH *)DevicePath;
Print(L"\n%N BootEntry (%x) Start (%lX) Size (%lX)",
CDDevicePath->BootEntry,
CDDevicePath->PartitionStart,
CDDevicePath->PartitionSize
);
break;
case MEDIA_VENDOR_DP:
VendorDevicePath = (VENDOR_DEVICE_PATH *)DevicePath;
Print(L"\n%N Guid %g",
&VendorDevicePath->Guid
);
break;
case MEDIA_FILEPATH_DP:
FilePath = (FILEPATH_DEVICE_PATH *) DevicePath;
Print(L"\n%N File '%hs'", FilePath->PathName);
break;
case MEDIA_PROTOCOL_DP:
MediaProtocol = (MEDIA_PROTOCOL_DEVICE_PATH *) DevicePath;
Print(L"\n%N Protocol '%hg'", &MediaProtocol->Protocol);
break;
};
}
struct DevicePathTypes SEnvDP_Strings[] = {
0x00, 0x01, L"Illegal", SEnvDP_IlleagalStr, NULL,
0x01, 0x03, L"Hardware", SEnvDP_HardwareStr, SEnvHardwareDevicePathEntry,
0x02, 0x01, L"PNP", SEnvDP_PnP_Str, SEnvPnpDevicePathEntry,
0x03, 0x0a, L"Messaging", SEnvDP_MessageStr, NULL,
0x04, 0x05, L"Media", SEnvDP_MediaStr, SEnvMediaDevicePathEntry,
0x05, 0x01, L"BBS", SEnvDP_BBS_Str, NULL,
END_DEVICE_PATH_TYPE, 0x01, L"End", SEnvDP_IlleagalStr, NULL
};
VOID
SEnvPrintDevicePathEntry (
IN EFI_DEVICE_PATH *DevicePath,
IN BOOLEAN Verbose
)
{
UINT8 Type;
UINT8 SubType;
INTN i;
Type = DevicePathType(DevicePath);
SubType = DevicePathSubType(DevicePath);
for (i=0; SEnvDP_Strings[i].Type != END_DEVICE_PATH_TYPE;i++) {
if (Type == SEnvDP_Strings[i].Type) {
if (SubType > SEnvDP_Strings[i].MaxSubType) {
SubType = 0;
}
Print(L"\n%N %s Device Path for %s",
SEnvDP_Strings[i].TypeString,
SEnvDP_Strings[i].SubTypeStr[SubType]
);
if (Verbose) {
if(SEnvDP_Strings[i].Function != NULL) {
SEnvDP_Strings[i].Function(DevicePath);
}
}
return;
}
}
Print(L"\n%E Device Path Error%N - Unknown Device Type");
DbgPrint (D_ERROR, "%EDevice Path Error%N - Unknown Device Type");
}
VOID
SEnvDPath (
IN EFI_HANDLE h,
IN VOID *Interface
)
{
EFI_DEVICE_PATH *DevicePath, *DevicePathNode;
CHAR16 *Str;
DevicePath = Interface;
Str = DevicePathToStr (DevicePath);
DevicePath = UnpackDevicePath (DevicePath);
DevicePathNode = DevicePath;
while (!IsDevicePathEnd(DevicePathNode)) {
SEnvPrintDevicePathEntry(DevicePathNode, TRUE);
DevicePathNode = NextDevicePathNode(DevicePathNode);
}
Print (L"\n AsStr:%N '%s'\n", Str);
FreePool (Str);
FreePool (DevicePath);
}
VOID
SEnvDPathTok (
IN EFI_HANDLE h,
IN VOID *Interface
)
{
EFI_DEVICE_PATH *DevicePath;
CHAR16 *Str, *Disp;
UINTN Len;
DevicePath = Interface;
Str = DevicePathToStr (DevicePath);
Disp = L"";
if (Str) {
Len = StrLen(Str);
Disp = Str;
if (Len > 30) {
Disp = Str + Len - 30;
Disp[0] = '.';
Disp[1] = '.';
}
}
Print (L"DevPath(%s)", Disp);
if (Str) {
FreePool (Str);
}
}
VOID
SEnvTextOut (
IN EFI_HANDLE h,
IN VOID *Interface
)
{
SIMPLE_TEXT_OUTPUT_INTERFACE *Dev;
INTN i;
UINTN Col, Row;
EFI_STATUS Status;
Dev = Interface;
Print (L"Attrib %x",
Dev->Mode->Attribute
);
for (i=0; i < Dev->Mode->MaxMode; i++) {
Status = Dev->QueryMode (Dev, i, &Col, &Row);
Print (L"\n%N %hc mode %d: ",
i == Dev->Mode->Mode ? '*' : ' ',
i
);
if (EFI_ERROR(Status)) {
Print (L"%error %rx\n", Status);
} else {
Print (L"col %3d row %3d", Col, Row);
}
}
}
VOID
SEnvBlkIo (
IN EFI_HANDLE h,
IN VOID *Interface
)
{
EFI_BLOCK_IO *BlkIo;
EFI_BLOCK_IO_MEDIA *BlkMedia;
VOID *Buffer;
BlkIo = Interface;
BlkMedia = BlkIo->Media;
/* issue a dumby read to the device to check for media change */
Buffer = AllocatePool (BlkMedia->BlockSize);
if (Buffer) {
BlkIo->ReadBlocks(BlkIo, BlkMedia->MediaId, 0, BlkMedia->BlockSize, Buffer);
FreePool (Buffer);
}
Print (L"%s%esMId:%x ",
BlkMedia->RemovableMedia ? L"Removable " : L"Fixed ",
BlkMedia->MediaPresent ? L"" : L"not-present ",
BlkMedia->MediaId
);
Print (L"bsize %x, lblock %lx (%,ld), %s %s %s",
BlkMedia->BlockSize,
BlkMedia->LastBlock,
MultU64x32 (BlkMedia->LastBlock + 1, BlkMedia->BlockSize),
BlkMedia->LogicalPartition ? L"partition" : L"raw",
BlkMedia->ReadOnly ? L"ro" : L"rw",
BlkMedia->WriteCaching ? L"cached" : L"!cached"
);
}
VOID
SEnvImageTok (
IN EFI_HANDLE h,
IN VOID *Interface
)
{
EFI_LOADED_IMAGE *Image;
CHAR16 *Tok;
Image = Interface;
Tok = DevicePathToStr (Image->FilePath);
Print (L"%HImage%N(%s) ", Tok);
if (Tok) {
FreePool (Tok);
}
}
VOID
SEnvImage (
IN EFI_HANDLE h,
IN VOID *Interface
)
{
EFI_LOADED_IMAGE *Image;
CHAR16 *FilePath;
Image = Interface;
FilePath = DevicePathToStr (Image->FilePath);
Print (L" File:%hs\n", FilePath);
if (!Image->ImageBase) {
Print (L" %EInternal Image:%N %s\n", FilePath);
Print (L" CodeType......: %s\n", MemoryTypeStr(Image->ImageCodeType));
Print (L" DataType......: %s\n", MemoryTypeStr(Image->ImageDataType));
} else {
Print (L" ParentHandle..: %X\n", Image->ParentHandle);
Print (L" SystemTable...: %X\n", Image->SystemTable);
Print (L" DeviceHandle..: %X\n", Image->DeviceHandle);
Print (L" FilePath......: %s\n", FilePath);
Print (L" ImageBase.....: %X - %X\n",
Image->ImageBase,
(CHAR8 *) Image->ImageBase + Image->ImageSize
);
Print (L" ImageSize.....: %lx\n", Image->ImageSize);
Print (L" CodeType......: %s\n", MemoryTypeStr(Image->ImageCodeType));
Print (L" DataType......: %s\n", MemoryTypeStr(Image->ImageDataType));
}
if (FilePath) {
FreePool (FilePath);
}
}