Home | History | Annotate | Line # | Download | only in lib
sread.c revision 1.1.1.1.4.2
      1  1.1.1.1.4.2  rmind /*	$NetBSD: sread.c,v 1.1.1.1.4.2 2014/05/18 17:46:03 rmind Exp $	*/
      2  1.1.1.1.4.2  rmind 
      3  1.1.1.1.4.2  rmind /*++
      4  1.1.1.1.4.2  rmind 
      5  1.1.1.1.4.2  rmind Copyright (c) 1998  Intel Corporation
      6  1.1.1.1.4.2  rmind 
      7  1.1.1.1.4.2  rmind Module Name:
      8  1.1.1.1.4.2  rmind 
      9  1.1.1.1.4.2  rmind     sread.c
     10  1.1.1.1.4.2  rmind 
     11  1.1.1.1.4.2  rmind Abstract:
     12  1.1.1.1.4.2  rmind 
     13  1.1.1.1.4.2  rmind     Simple read file access
     14  1.1.1.1.4.2  rmind 
     15  1.1.1.1.4.2  rmind 
     16  1.1.1.1.4.2  rmind 
     17  1.1.1.1.4.2  rmind Revision History
     18  1.1.1.1.4.2  rmind 
     19  1.1.1.1.4.2  rmind --*/
     20  1.1.1.1.4.2  rmind 
     21  1.1.1.1.4.2  rmind #include "lib.h"
     22  1.1.1.1.4.2  rmind 
     23  1.1.1.1.4.2  rmind #define SIMPLE_READ_SIGNATURE       EFI_SIGNATURE_32('s','r','d','r')
     24  1.1.1.1.4.2  rmind typedef struct _SIMPLE_READ_FILE {
     25  1.1.1.1.4.2  rmind     UINTN               Signature;
     26  1.1.1.1.4.2  rmind     BOOLEAN             FreeBuffer;
     27  1.1.1.1.4.2  rmind     VOID                *Source;
     28  1.1.1.1.4.2  rmind     UINTN               SourceSize;
     29  1.1.1.1.4.2  rmind     EFI_FILE_HANDLE     FileHandle;
     30  1.1.1.1.4.2  rmind } SIMPLE_READ_HANDLE;
     31  1.1.1.1.4.2  rmind 
     32  1.1.1.1.4.2  rmind 
     33  1.1.1.1.4.2  rmind 
     34  1.1.1.1.4.2  rmind EFI_STATUS
     35  1.1.1.1.4.2  rmind OpenSimpleReadFile (
     36  1.1.1.1.4.2  rmind     IN BOOLEAN                  BootPolicy,
     37  1.1.1.1.4.2  rmind     IN VOID                     *SourceBuffer   OPTIONAL,
     38  1.1.1.1.4.2  rmind     IN UINTN                    SourceSize,
     39  1.1.1.1.4.2  rmind     IN OUT EFI_DEVICE_PATH      **FilePath,
     40  1.1.1.1.4.2  rmind     OUT EFI_HANDLE              *DeviceHandle,
     41  1.1.1.1.4.2  rmind     OUT SIMPLE_READ_FILE        *SimpleReadHandle
     42  1.1.1.1.4.2  rmind     )
     43  1.1.1.1.4.2  rmind /*++
     44  1.1.1.1.4.2  rmind 
     45  1.1.1.1.4.2  rmind Routine Description:
     46  1.1.1.1.4.2  rmind 
     47  1.1.1.1.4.2  rmind     Opens a file for (simple) reading.  The simple read abstraction
     48  1.1.1.1.4.2  rmind     will access the file either from a memory copy, from a file
     49  1.1.1.1.4.2  rmind     system interface, or from the load file interface.
     50  1.1.1.1.4.2  rmind 
     51  1.1.1.1.4.2  rmind Arguments:
     52  1.1.1.1.4.2  rmind 
     53  1.1.1.1.4.2  rmind Returns:
     54  1.1.1.1.4.2  rmind 
     55  1.1.1.1.4.2  rmind     A handle to access the file
     56  1.1.1.1.4.2  rmind 
     57  1.1.1.1.4.2  rmind --*/
     58  1.1.1.1.4.2  rmind {
     59  1.1.1.1.4.2  rmind     SIMPLE_READ_HANDLE          *FHand;
     60  1.1.1.1.4.2  rmind     EFI_DEVICE_PATH             *UserFilePath;
     61  1.1.1.1.4.2  rmind     EFI_DEVICE_PATH             *TempFilePath;
     62  1.1.1.1.4.2  rmind     EFI_DEVICE_PATH             *TempFilePathPtr;
     63  1.1.1.1.4.2  rmind     FILEPATH_DEVICE_PATH        *FilePathNode;
     64  1.1.1.1.4.2  rmind     EFI_FILE_HANDLE             FileHandle, LastHandle;
     65  1.1.1.1.4.2  rmind     EFI_STATUS                  Status;
     66  1.1.1.1.4.2  rmind     EFI_LOAD_FILE_INTERFACE     *LoadFile;
     67  1.1.1.1.4.2  rmind 
     68  1.1.1.1.4.2  rmind     FHand = NULL;
     69  1.1.1.1.4.2  rmind     UserFilePath = *FilePath;
     70  1.1.1.1.4.2  rmind 
     71  1.1.1.1.4.2  rmind     //
     72  1.1.1.1.4.2  rmind     // Allocate a new simple read handle structure
     73  1.1.1.1.4.2  rmind     //
     74  1.1.1.1.4.2  rmind 
     75  1.1.1.1.4.2  rmind     FHand = AllocateZeroPool (sizeof(SIMPLE_READ_HANDLE));
     76  1.1.1.1.4.2  rmind     if (!FHand) {
     77  1.1.1.1.4.2  rmind         Status = EFI_OUT_OF_RESOURCES;
     78  1.1.1.1.4.2  rmind         goto Done;
     79  1.1.1.1.4.2  rmind     }
     80  1.1.1.1.4.2  rmind 
     81  1.1.1.1.4.2  rmind     *SimpleReadHandle = (SIMPLE_READ_FILE) FHand;
     82  1.1.1.1.4.2  rmind     FHand->Signature = SIMPLE_READ_SIGNATURE;
     83  1.1.1.1.4.2  rmind 
     84  1.1.1.1.4.2  rmind     //
     85  1.1.1.1.4.2  rmind     // If the caller passed a copy of the file, then just use it
     86  1.1.1.1.4.2  rmind     //
     87  1.1.1.1.4.2  rmind 
     88  1.1.1.1.4.2  rmind     if (SourceBuffer) {
     89  1.1.1.1.4.2  rmind         FHand->Source = SourceBuffer;
     90  1.1.1.1.4.2  rmind         FHand->SourceSize = SourceSize;
     91  1.1.1.1.4.2  rmind         *DeviceHandle = NULL;
     92  1.1.1.1.4.2  rmind         Status = EFI_SUCCESS;
     93  1.1.1.1.4.2  rmind         goto Done;
     94  1.1.1.1.4.2  rmind     }
     95  1.1.1.1.4.2  rmind 
     96  1.1.1.1.4.2  rmind     //
     97  1.1.1.1.4.2  rmind     // Attempt to access the file via a file system interface
     98  1.1.1.1.4.2  rmind     //
     99  1.1.1.1.4.2  rmind 
    100  1.1.1.1.4.2  rmind     FileHandle = NULL;
    101  1.1.1.1.4.2  rmind     Status = uefi_call_wrapper(BS->LocateDevicePath, 3, &FileSystemProtocol, FilePath, DeviceHandle);
    102  1.1.1.1.4.2  rmind     if (!EFI_ERROR(Status)) {
    103  1.1.1.1.4.2  rmind         FileHandle = LibOpenRoot (*DeviceHandle);
    104  1.1.1.1.4.2  rmind     }
    105  1.1.1.1.4.2  rmind 
    106  1.1.1.1.4.2  rmind     Status = FileHandle ? EFI_SUCCESS : EFI_UNSUPPORTED;
    107  1.1.1.1.4.2  rmind 
    108  1.1.1.1.4.2  rmind     //
    109  1.1.1.1.4.2  rmind     // To access as a filesystem, the filepath should only
    110  1.1.1.1.4.2  rmind     // contain filepath components.  Follow the filepath nodes
    111  1.1.1.1.4.2  rmind     // and find the target file
    112  1.1.1.1.4.2  rmind     //
    113  1.1.1.1.4.2  rmind 
    114  1.1.1.1.4.2  rmind     FilePathNode = (FILEPATH_DEVICE_PATH *) *FilePath;
    115  1.1.1.1.4.2  rmind     while (!IsDevicePathEnd(&FilePathNode->Header)) {
    116  1.1.1.1.4.2  rmind 
    117  1.1.1.1.4.2  rmind         //
    118  1.1.1.1.4.2  rmind         // For filesystem access each node should be a filepath component
    119  1.1.1.1.4.2  rmind         //
    120  1.1.1.1.4.2  rmind 
    121  1.1.1.1.4.2  rmind         if (DevicePathType(&FilePathNode->Header) != MEDIA_DEVICE_PATH ||
    122  1.1.1.1.4.2  rmind             DevicePathSubType(&FilePathNode->Header) != MEDIA_FILEPATH_DP) {
    123  1.1.1.1.4.2  rmind             Status = EFI_UNSUPPORTED;
    124  1.1.1.1.4.2  rmind         }
    125  1.1.1.1.4.2  rmind 
    126  1.1.1.1.4.2  rmind         //
    127  1.1.1.1.4.2  rmind         // If there's been an error, stop
    128  1.1.1.1.4.2  rmind         //
    129  1.1.1.1.4.2  rmind 
    130  1.1.1.1.4.2  rmind         if (EFI_ERROR(Status)) {
    131  1.1.1.1.4.2  rmind             break;
    132  1.1.1.1.4.2  rmind         }
    133  1.1.1.1.4.2  rmind 
    134  1.1.1.1.4.2  rmind         //
    135  1.1.1.1.4.2  rmind         // Open this file path node
    136  1.1.1.1.4.2  rmind         //
    137  1.1.1.1.4.2  rmind 
    138  1.1.1.1.4.2  rmind         LastHandle = FileHandle;
    139  1.1.1.1.4.2  rmind         FileHandle = NULL;
    140  1.1.1.1.4.2  rmind 
    141  1.1.1.1.4.2  rmind         Status = uefi_call_wrapper(
    142  1.1.1.1.4.2  rmind 			LastHandle->Open,
    143  1.1.1.1.4.2  rmind 			5,
    144  1.1.1.1.4.2  rmind                         LastHandle,
    145  1.1.1.1.4.2  rmind                         &FileHandle,
    146  1.1.1.1.4.2  rmind                         FilePathNode->PathName,
    147  1.1.1.1.4.2  rmind                         EFI_FILE_MODE_READ,
    148  1.1.1.1.4.2  rmind                         0
    149  1.1.1.1.4.2  rmind                         );
    150  1.1.1.1.4.2  rmind 
    151  1.1.1.1.4.2  rmind         //
    152  1.1.1.1.4.2  rmind         // Close the last node
    153  1.1.1.1.4.2  rmind         //
    154  1.1.1.1.4.2  rmind 
    155  1.1.1.1.4.2  rmind         uefi_call_wrapper(LastHandle->Close, 1, LastHandle);
    156  1.1.1.1.4.2  rmind 
    157  1.1.1.1.4.2  rmind         //
    158  1.1.1.1.4.2  rmind         // Get the next node
    159  1.1.1.1.4.2  rmind         //
    160  1.1.1.1.4.2  rmind 
    161  1.1.1.1.4.2  rmind         FilePathNode = (FILEPATH_DEVICE_PATH *) NextDevicePathNode(&FilePathNode->Header);
    162  1.1.1.1.4.2  rmind     }
    163  1.1.1.1.4.2  rmind 
    164  1.1.1.1.4.2  rmind     //
    165  1.1.1.1.4.2  rmind     // If success, return the FHand
    166  1.1.1.1.4.2  rmind     //
    167  1.1.1.1.4.2  rmind 
    168  1.1.1.1.4.2  rmind     if (!EFI_ERROR(Status)) {
    169  1.1.1.1.4.2  rmind         ASSERT(FileHandle);
    170  1.1.1.1.4.2  rmind         FHand->FileHandle = FileHandle;
    171  1.1.1.1.4.2  rmind         goto Done;
    172  1.1.1.1.4.2  rmind     }
    173  1.1.1.1.4.2  rmind 
    174  1.1.1.1.4.2  rmind     //
    175  1.1.1.1.4.2  rmind     // Cleanup from filesystem access
    176  1.1.1.1.4.2  rmind     //
    177  1.1.1.1.4.2  rmind 
    178  1.1.1.1.4.2  rmind     if (FileHandle) {
    179  1.1.1.1.4.2  rmind         uefi_call_wrapper(FileHandle->Close, 1, FileHandle);
    180  1.1.1.1.4.2  rmind         FileHandle = NULL;
    181  1.1.1.1.4.2  rmind         *FilePath = UserFilePath;
    182  1.1.1.1.4.2  rmind     }
    183  1.1.1.1.4.2  rmind 
    184  1.1.1.1.4.2  rmind     //
    185  1.1.1.1.4.2  rmind     // If the error is something other then unsupported, return it
    186  1.1.1.1.4.2  rmind     //
    187  1.1.1.1.4.2  rmind 
    188  1.1.1.1.4.2  rmind     if (Status != EFI_UNSUPPORTED) {
    189  1.1.1.1.4.2  rmind         goto Done;
    190  1.1.1.1.4.2  rmind     }
    191  1.1.1.1.4.2  rmind 
    192  1.1.1.1.4.2  rmind     //
    193  1.1.1.1.4.2  rmind     // Attempt to access the file via the load file protocol
    194  1.1.1.1.4.2  rmind     //
    195  1.1.1.1.4.2  rmind 
    196  1.1.1.1.4.2  rmind     Status = LibDevicePathToInterface (&LoadFileProtocol, *FilePath, (VOID*)&LoadFile);
    197  1.1.1.1.4.2  rmind     if (!EFI_ERROR(Status)) {
    198  1.1.1.1.4.2  rmind 
    199  1.1.1.1.4.2  rmind         TempFilePath = DuplicateDevicePath (*FilePath);
    200  1.1.1.1.4.2  rmind 
    201  1.1.1.1.4.2  rmind         TempFilePathPtr = TempFilePath;
    202  1.1.1.1.4.2  rmind 
    203  1.1.1.1.4.2  rmind         Status = uefi_call_wrapper(BS->LocateDevicePath, 3, &LoadFileProtocol, &TempFilePath, DeviceHandle);
    204  1.1.1.1.4.2  rmind 
    205  1.1.1.1.4.2  rmind         FreePool (TempFilePathPtr);
    206  1.1.1.1.4.2  rmind 
    207  1.1.1.1.4.2  rmind         //
    208  1.1.1.1.4.2  rmind         // Determine the size of buffer needed to hold the file
    209  1.1.1.1.4.2  rmind         //
    210  1.1.1.1.4.2  rmind 
    211  1.1.1.1.4.2  rmind         SourceSize = 0;
    212  1.1.1.1.4.2  rmind         Status = uefi_call_wrapper(
    213  1.1.1.1.4.2  rmind 		    LoadFile->LoadFile,
    214  1.1.1.1.4.2  rmind 			5,
    215  1.1.1.1.4.2  rmind                     LoadFile,
    216  1.1.1.1.4.2  rmind                     *FilePath,
    217  1.1.1.1.4.2  rmind                     BootPolicy,
    218  1.1.1.1.4.2  rmind                     &SourceSize,
    219  1.1.1.1.4.2  rmind                     NULL
    220  1.1.1.1.4.2  rmind                     );
    221  1.1.1.1.4.2  rmind 
    222  1.1.1.1.4.2  rmind         //
    223  1.1.1.1.4.2  rmind         // We expect a buffer too small error to inform us
    224  1.1.1.1.4.2  rmind         // of the buffer size needed
    225  1.1.1.1.4.2  rmind         //
    226  1.1.1.1.4.2  rmind 
    227  1.1.1.1.4.2  rmind         if (Status == EFI_BUFFER_TOO_SMALL) {
    228  1.1.1.1.4.2  rmind             SourceBuffer = AllocatePool (SourceSize);
    229  1.1.1.1.4.2  rmind 
    230  1.1.1.1.4.2  rmind             if (SourceBuffer) {
    231  1.1.1.1.4.2  rmind                 FHand->FreeBuffer = TRUE;
    232  1.1.1.1.4.2  rmind                 FHand->Source = SourceBuffer;
    233  1.1.1.1.4.2  rmind                 FHand->SourceSize = SourceSize;
    234  1.1.1.1.4.2  rmind 
    235  1.1.1.1.4.2  rmind                 Status = uefi_call_wrapper(
    236  1.1.1.1.4.2  rmind 			    LoadFile->LoadFile,
    237  1.1.1.1.4.2  rmind 				5,
    238  1.1.1.1.4.2  rmind                             LoadFile,
    239  1.1.1.1.4.2  rmind                             *FilePath,
    240  1.1.1.1.4.2  rmind                             BootPolicy,
    241  1.1.1.1.4.2  rmind                             &SourceSize,
    242  1.1.1.1.4.2  rmind                             SourceBuffer
    243  1.1.1.1.4.2  rmind                             );
    244  1.1.1.1.4.2  rmind             }
    245  1.1.1.1.4.2  rmind         }
    246  1.1.1.1.4.2  rmind 
    247  1.1.1.1.4.2  rmind         //
    248  1.1.1.1.4.2  rmind         // If success, return FHand
    249  1.1.1.1.4.2  rmind         //
    250  1.1.1.1.4.2  rmind 
    251  1.1.1.1.4.2  rmind         if (!EFI_ERROR(Status) || Status == EFI_ALREADY_STARTED) {
    252  1.1.1.1.4.2  rmind             goto Done;
    253  1.1.1.1.4.2  rmind         }
    254  1.1.1.1.4.2  rmind     }
    255  1.1.1.1.4.2  rmind 
    256  1.1.1.1.4.2  rmind     //
    257  1.1.1.1.4.2  rmind     // Nothing else to try
    258  1.1.1.1.4.2  rmind     //
    259  1.1.1.1.4.2  rmind 
    260  1.1.1.1.4.2  rmind     DEBUG ((D_LOAD|D_WARN, "OpenSimpleReadFile: Device did not support a known load protocol\n"));
    261  1.1.1.1.4.2  rmind     Status = EFI_UNSUPPORTED;
    262  1.1.1.1.4.2  rmind 
    263  1.1.1.1.4.2  rmind Done:
    264  1.1.1.1.4.2  rmind 
    265  1.1.1.1.4.2  rmind     //
    266  1.1.1.1.4.2  rmind     // If the file was not accessed, clean up
    267  1.1.1.1.4.2  rmind     //
    268  1.1.1.1.4.2  rmind     if (EFI_ERROR(Status) && (Status != EFI_ALREADY_STARTED)) {
    269  1.1.1.1.4.2  rmind         if (FHand) {
    270  1.1.1.1.4.2  rmind             if (FHand->FreeBuffer) {
    271  1.1.1.1.4.2  rmind                 FreePool (FHand->Source);
    272  1.1.1.1.4.2  rmind             }
    273  1.1.1.1.4.2  rmind 
    274  1.1.1.1.4.2  rmind             FreePool (FHand);
    275  1.1.1.1.4.2  rmind         }
    276  1.1.1.1.4.2  rmind     }
    277  1.1.1.1.4.2  rmind 
    278  1.1.1.1.4.2  rmind     return Status;
    279  1.1.1.1.4.2  rmind }
    280  1.1.1.1.4.2  rmind 
    281  1.1.1.1.4.2  rmind EFI_STATUS
    282  1.1.1.1.4.2  rmind ReadSimpleReadFile (
    283  1.1.1.1.4.2  rmind     IN SIMPLE_READ_FILE     UserHandle,
    284  1.1.1.1.4.2  rmind     IN UINTN                Offset,
    285  1.1.1.1.4.2  rmind     IN OUT UINTN            *ReadSize,
    286  1.1.1.1.4.2  rmind     OUT VOID                *Buffer
    287  1.1.1.1.4.2  rmind     )
    288  1.1.1.1.4.2  rmind {
    289  1.1.1.1.4.2  rmind     UINTN                   EndPos;
    290  1.1.1.1.4.2  rmind     SIMPLE_READ_HANDLE      *FHand;
    291  1.1.1.1.4.2  rmind     EFI_STATUS              Status;
    292  1.1.1.1.4.2  rmind 
    293  1.1.1.1.4.2  rmind     FHand = UserHandle;
    294  1.1.1.1.4.2  rmind     ASSERT (FHand->Signature == SIMPLE_READ_SIGNATURE);
    295  1.1.1.1.4.2  rmind     if (FHand->Source) {
    296  1.1.1.1.4.2  rmind 
    297  1.1.1.1.4.2  rmind         //
    298  1.1.1.1.4.2  rmind         // Move data from our local copy of the file
    299  1.1.1.1.4.2  rmind         //
    300  1.1.1.1.4.2  rmind 
    301  1.1.1.1.4.2  rmind         EndPos = Offset + *ReadSize;
    302  1.1.1.1.4.2  rmind         if (EndPos > FHand->SourceSize) {
    303  1.1.1.1.4.2  rmind             *ReadSize = FHand->SourceSize - Offset;
    304  1.1.1.1.4.2  rmind             if (Offset >= FHand->SourceSize) {
    305  1.1.1.1.4.2  rmind                 *ReadSize = 0;
    306  1.1.1.1.4.2  rmind             }
    307  1.1.1.1.4.2  rmind         }
    308  1.1.1.1.4.2  rmind 
    309  1.1.1.1.4.2  rmind         CopyMem (Buffer, (CHAR8 *) FHand->Source + Offset, *ReadSize);
    310  1.1.1.1.4.2  rmind         Status = EFI_SUCCESS;
    311  1.1.1.1.4.2  rmind 
    312  1.1.1.1.4.2  rmind     } else {
    313  1.1.1.1.4.2  rmind 
    314  1.1.1.1.4.2  rmind         //
    315  1.1.1.1.4.2  rmind         // Read data from the file
    316  1.1.1.1.4.2  rmind         //
    317  1.1.1.1.4.2  rmind 
    318  1.1.1.1.4.2  rmind         Status = uefi_call_wrapper(FHand->FileHandle->SetPosition, 2, FHand->FileHandle, Offset);
    319  1.1.1.1.4.2  rmind 
    320  1.1.1.1.4.2  rmind         if (!EFI_ERROR(Status)) {
    321  1.1.1.1.4.2  rmind             Status = uefi_call_wrapper(FHand->FileHandle->Read, 3, FHand->FileHandle, ReadSize, Buffer);
    322  1.1.1.1.4.2  rmind         }
    323  1.1.1.1.4.2  rmind     }
    324  1.1.1.1.4.2  rmind 
    325  1.1.1.1.4.2  rmind     return Status;
    326  1.1.1.1.4.2  rmind }
    327  1.1.1.1.4.2  rmind 
    328  1.1.1.1.4.2  rmind 
    329  1.1.1.1.4.2  rmind VOID
    330  1.1.1.1.4.2  rmind CloseSimpleReadFile (
    331  1.1.1.1.4.2  rmind     IN SIMPLE_READ_FILE     UserHandle
    332  1.1.1.1.4.2  rmind     )
    333  1.1.1.1.4.2  rmind {
    334  1.1.1.1.4.2  rmind     SIMPLE_READ_HANDLE      *FHand;
    335  1.1.1.1.4.2  rmind 
    336  1.1.1.1.4.2  rmind     FHand = UserHandle;
    337  1.1.1.1.4.2  rmind     ASSERT (FHand->Signature == SIMPLE_READ_SIGNATURE);
    338  1.1.1.1.4.2  rmind 
    339  1.1.1.1.4.2  rmind     //
    340  1.1.1.1.4.2  rmind     // Free any file handle we opened
    341  1.1.1.1.4.2  rmind     //
    342  1.1.1.1.4.2  rmind 
    343  1.1.1.1.4.2  rmind     if (FHand->FileHandle) {
    344  1.1.1.1.4.2  rmind         uefi_call_wrapper(FHand->FileHandle->Close, 1, FHand->FileHandle);
    345  1.1.1.1.4.2  rmind     }
    346  1.1.1.1.4.2  rmind 
    347  1.1.1.1.4.2  rmind     //
    348  1.1.1.1.4.2  rmind     // If we allocated the Source buffer, free it
    349  1.1.1.1.4.2  rmind     //
    350  1.1.1.1.4.2  rmind 
    351  1.1.1.1.4.2  rmind     if (FHand->FreeBuffer) {
    352  1.1.1.1.4.2  rmind         FreePool (FHand->Source);
    353  1.1.1.1.4.2  rmind     }
    354  1.1.1.1.4.2  rmind 
    355  1.1.1.1.4.2  rmind     //
    356  1.1.1.1.4.2  rmind     // Done with this simple read file handle
    357  1.1.1.1.4.2  rmind     //
    358  1.1.1.1.4.2  rmind 
    359  1.1.1.1.4.2  rmind     FreePool (FHand);
    360  1.1.1.1.4.2  rmind }
    361