4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*++
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This file contains an 'Intel UEFI Application' and is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync licensed for Intel CPUs and chipsets under the terms of your
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync license agreement with Intel or your vendor. This file may
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync be modified by the user, subject to additional terms of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync license agreement
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*++
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2011 Intel Corporation. All rights reserved
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis software and associated documentation (if any) is furnished
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncunder a license and may only be used or copied in accordance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwith the terms of the license. Except as permitted by such
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynclicense, no part of this software or documentation may be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncreproduced, stored in a retrieval system, or transmitted in any
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncform or by any means without the express written consent of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIntel Corporation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Display the handles in the system
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <WebServer.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Respond with the handles in the system
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param [in] SocketFD The socket's file descriptor to add to the list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param [in] pPort The WSDT_PORT structure address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param [out] pbDone Address to receive the request completion status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The request was successfully processed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHandlePage (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN int SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN WSDT_PORT * pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT BOOLEAN * pbDone
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN Digit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN Entries;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN GuidCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN LengthInBytes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 * pDigit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE * pHandleArray;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE * pHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE * pHandleEnd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GUID ** ppGuidArray;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GUID ** ppGuid;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GUID ** ppGuidEnd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN Shift;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST UINTN cDigit [] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15 };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DBG_ENTER ( );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Send the handles page
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( ; ; ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Send the page header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HttpPageHeader ( SocketFD, pPort, L"Handle Database" );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Build the table header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HttpSendAnsiString ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "<h1>Handle Database</h1>\r\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "<table border=\"1\">\r\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync " <tr bgcolor=\"c0c0ff\"><th>Handle</th><th>Protocol Guids</th></tr>\r\n" );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Determine the number of handles in the database
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LengthInBytes = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateHandle ( AllHandles,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &LengthInBytes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_BUFFER_TOO_SMALL == Status ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate space for the handles
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->AllocatePool ( EfiRuntimeServicesData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LengthInBytes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &pHandleArray );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( !EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the list of handles
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateHandle ( AllHandles,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &LengthInBytes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pHandleArray );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( !EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Entries = LengthInBytes / sizeof ( *pHandleArray );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pHandle = pHandleArray;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pHandleEnd = &pHandle [ Entries ];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ( pHandleEnd > pHandle ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Build the table entry for this page
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HttpSendAnsiString ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "<tr><td><code>0x" );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = (UINTN) *pHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Shift = ( sizeof ( Shift ) << 3 ) - 4; 0 <= Shift; Shift -= 4 ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the next address nibble to ANSI hex
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Digit = (( Value >> Shift ) & 0xf ) | '0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( '9' < Digit ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Digit += 'a' - '0' - 10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Display the address digit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HttpSendByte ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT8) Digit );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Start the second column
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HttpSendAnsiString ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "</code></td><td><code>\r\n" );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Determine the number of protocols connected to this handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->ProtocolsPerHandle ( *pHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ppGuidArray,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &GuidCount );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ppGuid = ppGuidArray;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ppGuidEnd = &ppGuid [ GuidCount ];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ( ppGuidEnd > ppGuid ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Display the guid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pDigit = (UINT8 *) *ppGuid;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Index = 0; 16 > Index; Index++ ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Separate the portions of the GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 99E87DCF-6162-40c5-9FA1-32111F5197F7
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (( 4 == Index )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || ( 6 == Index )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || ( 8 == Index )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || ( 10 == Index )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HttpSendByte ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '-' );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Display the GUID digits
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = pDigit [ cDigit [ Index ]];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Shift = 4; 0 <= Shift; Shift -= 4 ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the next address nibble to ANSI hex
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Digit = (( Value >> Shift ) & 0xf ) | '0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( '9' < Digit ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Digit += 'a' - '0' - 10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Display the address digit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HttpSendByte ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT8) Digit );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Separate each GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HttpSendAnsiString ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "<br/>\r\n" );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the next protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ppGuid+= 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the GUID array
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->FreePool ( ppGuidArray );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // End the row
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HttpSendAnsiString ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "</code></td></tr>\r\n" );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the next handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pHandle += 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Done with the handle array
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->FreePool ( pHandleArray );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Build the table trailer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HttpSendAnsiString ( SocketFD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "</table>\r\n" );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR ( Status )) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Send the page trailer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HttpPageTrailer ( SocketFD, pPort, pbDone );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return the operation status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DBG_EXIT_STATUS ( Status );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}