Ejemplo n.º 1
0
    def SetSize(self, FileSpace, FileFolder, FileSize):

        if self.Shell.WS[FileSpace.upper()][WsIdxPath] == u"":
            self.StdOut.printf(u"%s is not valide volume\r\n" % FileSpace)
            return

        RootFs, FilePath = EfiPyFileOp.GetRootFsOperation(
            self.Shell.WS, u"%s%s" % (FileSpace, FileFolder))
        if RootFs == None:
            self.StdOut.printf(u"Volume %s cannot be opened\r\n" % FileSpace)
            return 0

        NewFs = EfiPy.POINTER(EFI_FILE_PROTOCOL)()
        Status = RootFs.Open(EfiPy.byref(RootFs), EfiPy.byref(NewFs),
                             FileFolder,
                             EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, 0)

        if Status == EfiPy.EFI_NOT_FOUND:
            Status = RootFs.Open(
                EfiPy.byref(RootFs), EfiPy.byref(NewFs), FileFolder,
                EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE
                | EFI_FILE_MODE_CREATE, 0)

        if EfiPy.EFI_ERROR(Status):
            self.StdOut.printf(u"File %s%s cannot be opened 0x%016X\r\n" %
                               (FileSpace, FileFolder, Status))
            return 0

        BufferSize = EfiPy.UINTN(0)
        Status = NewFs[0].GetInfo(NewFs, gEfiFileInfoGuid,
                                  EfiPy.byref(BufferSize), None)

        if Status != EfiPy.EFI_BUFFER_TOO_SMALL:
            NewFs[0].Close(NewFs)
            return 0

        TmpBuffer = bytearray(BufferSize.value)
        fInfo = EFI_FILE_INFO.from_buffer(TmpBuffer)
        Status = NewFs[0].GetInfo(NewFs, gEfiFileInfoGuid,
                                  EfiPy.byref(BufferSize), EfiPy.byref(fInfo))

        if Status != EfiPy.EFI_SUCCESS:
            NewFs[0].Close(NewFs)
            return 0

        fInfo.FileSize = FileSize

        Status = NewFs[0].SetInfo(NewFs, gEfiFileInfoGuid, BufferSize,
                                  EfiPy.byref(fInfo))

        self.StdOut.printf(u"Set size %s%s, Status: 0x%016X\r\n" %
                           (FileSpace, FileFolder, Status))

        NewFs[0].Close(NewFs)

        return 0
Ejemplo n.º 2
0
  def ParseAbsPath (self, FileHandle):

    AbsList = []

    Status = EfiPy.EFI_SUCCESS

    while Status == EfiPy.EFI_SUCCESS:

      BufferSize = EfiPy.UINTN (0)
      Status = FileHandle.GetInfo (
                            EfiPy.byref (FileHandle),
                            gEfiFileInfoGuid,
                            EfiPy.byref (BufferSize),
                            None
                            )

      TmpBuffer = bytearray (BufferSize.value)
      fInfo      = EFI_FILE_INFO.from_buffer (TmpBuffer)
      Status = FileHandle.GetInfo (
                            EfiPy.byref (FileHandle),
                            gEfiFileInfoGuid,
                            EfiPy.byref (BufferSize),
                            EfiPy.byref (fInfo)
                            )

      if Status != EfiPy.EFI_SUCCESS:
        break

      TempStr = (TmpBuffer[EFI_FILE_INFO.FileName.offset: -2]).decode("utf-16")

      if fInfo.Attribute & EFI_FILE_DIRECTORY == EFI_FILE_DIRECTORY:
        AbsList.append (TempStr + u"\\")
      else:
        AbsList.append (TempStr)

      NewFs = EfiPy.POINTER(EFI_FILE_PROTOCOL) ()

      Status = FileHandle.Open (
                 EfiPy.byref (FileHandle),
                 EfiPy.byref (NewFs),
                 u"..",
                 EFI_FILE_MODE_READ,
                 0
                 )

      if Status != EfiPy.EFI_SUCCESS:
        break

      if len(AbsList) > 1:
        FileHandle.Close ( EfiPy.byref (FileHandle))
      FileHandle = NewFs[0]

    return "".join(v for v in AbsList[::-1])
Ejemplo n.º 3
0
    def Run(self):

        # if len (self.args) == 1:
        #   self.StdOut.printf("Invalide parameter %s\r\n" % str(self.args))
        #   return 0

        FilePath = self.args[0]
        FileSpace = self.Shell.WorkSpace[WsIdxVol]
        FileFolder = self.Shell.WorkSpace[WsIdxPath]

        FileSpace, TempFolder, SpaceOnly, SpaceFound = self.ParseFolder(
            FilePath)
        # print "===>", FileSpace, TempFolder, SpaceOnly, SpaceFound

        Fs1, FilePath1 = EfiPyFileOp.GetRootFsOperation(
            self.Shell.WS, u"%s%s" % (FileSpace, TempFolder))

        if Fs1 == None:
            self.StdOut.printf(u"File %s cannot be opened\r\n" % self.args[0])
            return 0

        Handle1 = EfiPy.POINTER(EFI_FILE_PROTOCOL)()
        Status = Fs1.Open(EfiPy.byref(Fs1), EfiPy.byref(Handle1), FilePath1,
                          EFI_FILE_MODE_READ, 0)

        if EfiPy.EFI_ERROR(Status):
            self.StdOut.printf(u"File %s cannot be opened\r\n" % self.args[0])
            return 0

        Fs1.Close(EfiPy.byref(Fs1))

        BufferSize = EfiPy.UINTN(0)
        Status = Handle1[0].GetInfo(Handle1, gEfiFileInfoGuid,
                                    EfiPy.byref(BufferSize), None)

        if Status != EfiPy.EFI_BUFFER_TOO_SMALL:
            Handle1[0].Close()
            return 0

        TmpBuffer = bytearray(BufferSize.value)
        fInfo1 = EFI_FILE_INFO.from_buffer(TmpBuffer)
        Status = Handle1[0].GetInfo(Handle1, gEfiFileInfoGuid,
                                    EfiPy.byref(BufferSize),
                                    EfiPy.byref(fInfo1))

        if Status != EfiPy.EFI_SUCCESS:
            Handle1[0].Close(Handle1)
            return 0

        if fInfo1.Attribute & EFI_FILE_ARCHIVE != EFI_FILE_ARCHIVE:
            self.StdOut.printf(u"Cannot run file %s%s\r\n" %
                               (FileSpace, TempFolder))
            Handle1[0].Close(Handle1)
            return 0

        Handle1[0].Close(Handle1)

        if not TempFolder.upper().endswith(".EFI"):
            self.StdOut.printf(u"Cannot run file %s%s\r\n" %
                               (FileSpace, TempFolder))
            return 0

        # print "Prepare to run %s%s\r\n" %(FileSpace, TempFolder)
        # print type(self.Shell.WS[FileSpace.upper()][WsIdxDevPath])
        Folder = self.Shell.WS[FileSpace.upper()][WsIdxDevPath]

        RawData = EfiPy.cast(EfiPy.pointer(Folder),
                             EfiPy.POINTER(EfiPy.CHAR8 * (16 * 10)))

        Folder.DisplayOnly = False
        Folder.AllowShortcuts = False
        FullPath = "%s/%s" % (Folder, TempFolder)
        # print FullPath

        Interface = EfiPy.PVOID()
        Status = EfiPy.gBS.LocateProtocol(
            EfiPy.byref(gEfiDevicePathFromTextProtocolGuid), None,
            EfiPy.byref(Interface))
        if EfiPy.EFI_ERROR(Status):
            return 0

        Text2Dev = EfiPy.cast(
            Interface, EfiPy.POINTER(EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL))
        pFullPathDev = Text2Dev[0].ConvertTextToDevicePath(FullPath)

        # print "%s" % pFullPathDev[0], EfiPy.sizeof (pFullPathDev[0])

        self.InternalExec(pFullPathDev, FullPath)

        return 0
Ejemplo n.º 4
0
    def Run(self):

        if len(self.args) == 1:
            self.StdOut.printf("Invalide parameter %s\r\n" % str(self.args))
            return 0

        FilePath = self.args[1]
        Address = 0x00L
        Length = -1L

        if self.Paras[u"address"][EfiPyCmdBase.ParaIdxSet] == True:
            print "Address is set"
            pass

        if self.Paras[u"length"][EfiPyCmdBase.ParaIdxSet] == True:
            print "length is set"
            pass

        FileSpace = self.Shell.WorkSpace[WsIdxVol]
        FileFolder = self.Shell.WorkSpace[WsIdxPath]

        FileSpace, TempFolder, SpaceOnly, SpaceFound = self.ParseFolder(
            FilePath)

        Fs1, FilePath1 = EfiPyFileOp.GetRootFsOperation(
            self.Shell.WS, u"%s%s" % (FileSpace, TempFolder))

        if Fs1 == None:
            self.StdOut.printf(u"File %s cannot be opened\r\n" % self.args[1])
            return 0

        Handle1 = EfiPy.POINTER(EFI_FILE_PROTOCOL)()
        Status = Fs1.Open(EfiPy.byref(Fs1), EfiPy.byref(Handle1), FilePath1,
                          EFI_FILE_MODE_READ, 0)

        if EfiPy.EFI_ERROR(Status):
            self.StdOut.printf(u"File %s cannot be opened\r\n" % self.args[1])
            return 0

        Fs1.Close(EfiPy.byref(Fs1))

        BufferSize = EfiPy.UINTN(0)
        Status = Handle1[0].GetInfo(Handle1, gEfiFileInfoGuid,
                                    EfiPy.byref(BufferSize), None)

        if Status != EfiPy.EFI_BUFFER_TOO_SMALL:
            Handle1[0].Close()
            return 0

        TmpBuffer = bytearray(BufferSize.value)
        fInfo1 = EFI_FILE_INFO.from_buffer(TmpBuffer)
        Status = Handle1[0].GetInfo(Handle1, gEfiFileInfoGuid,
                                    EfiPy.byref(BufferSize),
                                    EfiPy.byref(fInfo1))

        if Status != EfiPy.EFI_SUCCESS:
            Handle1[0].Close(Handle1)
            return 0

        if fInfo1.Attribute & EFI_FILE_ARCHIVE != EFI_FILE_ARCHIVE:
            self.StdOut.printf(u"Cannot dump none archive file %s%s\r\n" %
                               (FileSpace, TempFolder))
            Handle1[0].Close(Handle1)
            return 0

        if Length == -1:
            Length = fInfo1.FileSize

        if Address >= fInfo1.FileSize:
            self.StdOut.printf(
                u"Dump Start point more than file size 0x%08X.\r\n" %
                fInfo1.FileSize)
            Handle1[0].Close(Handle1)
            return 0

        Status = Handle1[0].SetPosition(Handle1, EfiPy.UINT64(Address))

        TotalSize = 0
        while True:

            BufferSize = EfiPy.UINT64(0x1000)
            TmpBuffer = (EfiPy.CHAR8 * 0x1000)()
            Status = Handle1[0].Read(Handle1, EfiPy.byref(BufferSize),
                                     EfiPy.byref(TmpBuffer))

            RetValue1 = (BufferSize.value, TmpBuffer)

            if RetValue1[0] == 0:
                break

            if Length >= len(RetValue1[1]):
                DumpBuff = RetValue1[1]
            else:
                DumpBuff = RetValue1[1][0:Length]

            for char in DumpBuff:
                if ord(char) >= 0x20 and ord(char) <= 0x7E:
                    self.StdOut.printf("%s" % char)
                elif ord(char) == 0x0D or ord(char) == 0x0A:
                    self.StdOut.printf("%s" % char)
                else:
                    self.StdOut.printf(".")

            Length -= RetValue1[0]

            TotalSize += RetValue1[0]

            if Length <= 0:
                break

        Handle1[0].Close(Handle1)

        return 0
Ejemplo n.º 5
0
    def Run(self):

        FileSpace = self.Shell.WorkSpace[WsIdxVol]
        FileFolder = self.Shell.WorkSpace[WsIdxPath]

        if len(self.args) != 3:
            self.StdOut.printf(u"File Compare: Invalide parameter\r\n")
            self.StdOut.printf(u"comp file1 file2\r\n")
            return 0

        #
        # Compare file 1
        #

        Space1, FileFolder1, SpaceOnly, SpaceFound = self.ParseFolder(
            self.args[1])

        Fs1, FilePath1 = EfiPyFileOp.GetRootFsOperation(
            self.Shell.WS, u"%s%s" % (Space1, FileFolder1))

        if Fs1 == None:
            self.StdOut.printf(u"File %s cannot be opened\r\n" % self.args[1])
            return 0

        FileHandle1 = EfiPy.POINTER(EFI_FILE_PROTOCOL)()
        Status = Fs1.Open(EfiPy.byref(Fs1), EfiPy.byref(FileHandle1),
                          FilePath1, EFI_FILE_MODE_READ, 0)

        if EfiPy.EFI_ERROR(Status):
            self.StdOut.printf(u"File %s cannot be opened\r\n" % self.args[1])
            return 0

        Fs1.Close(EfiPy.byref(Fs1))

        #
        # compare file 2
        #

        Space2, FileFolder2, SpaceOnly, SpaceFound = self.ParseFolder(
            self.args[2])

        Fs2, FilePath2 = EfiPyFileOp.GetRootFsOperation(
            self.Shell.WS, u"%s%s" % (Space2, FileFolder2))
        if Fs2 == None:
            self.StdOut.printf(u"File %s cannot be opened\r\n" % self.args[2])
            Fs2.Close()
            return 0

        FileHandle2 = EfiPy.POINTER(EFI_FILE_PROTOCOL)()
        Status = Fs2.Open(EfiPy.byref(Fs2), EfiPy.byref(FileHandle2),
                          FilePath2, EFI_FILE_MODE_READ, 0)

        if EfiPy.EFI_ERROR(Status):
            self.StdOut.printf(u"File %s cannot be opened\r\n" % self.args[2])
            return 0

        Fs2.Close(EfiPy.byref(Fs2))

        #
        # File 1, FIle 2 compare
        #

        BufferSize = EfiPy.UINTN(0)
        Status = FileHandle1[0].GetInfo(FileHandle1, gEfiFileInfoGuid,
                                        EfiPy.byref(BufferSize), None)

        if Status != EfiPy.EFI_BUFFER_TOO_SMALL:
            FileHandle1[0].Close(FileHandle1)
            FileHandle2[0].Close(FileHandle2)
            return 0

        TmpBuffer = bytearray(BufferSize.value)
        fInfo1 = EFI_FILE_INFO.from_buffer(TmpBuffer)
        Status = FileHandle1[0].GetInfo(FileHandle1, gEfiFileInfoGuid,
                                        EfiPy.byref(BufferSize),
                                        EfiPy.byref(fInfo1))

        if Status != EfiPy.EFI_SUCCESS:
            FileHandle1[0].Close(FileHandle1)
            FileHandle2[0].Close(FileHandle2)
            return 0

        BufferSize = EfiPy.UINTN(0)
        Status = FileHandle2[0].GetInfo(FileHandle2, gEfiFileInfoGuid,
                                        EfiPy.byref(BufferSize), None)

        if Status != EfiPy.EFI_BUFFER_TOO_SMALL:
            FileHandle1[0].Close(FileHandle1)
            FileHandle2[0].Close(FileHandle2)
            return 0

        TmpBuffer = bytearray(BufferSize.value)
        fInfo2 = EFI_FILE_INFO.from_buffer(TmpBuffer)
        Status = FileHandle2[0].GetInfo(FileHandle2, gEfiFileInfoGuid,
                                        EfiPy.byref(BufferSize),
                                        EfiPy.byref(fInfo2))

        if Status != EfiPy.EFI_SUCCESS:
            FileHandle1[0].Close(FileHandle1)
            FileHandle2[0].Close(FileHandle2)
            return 0

        if fInfo1.Attribute & EFI_FILE_DIRECTORY == EFI_FILE_DIRECTORY or \
           fInfo2.Attribute & EFI_FILE_DIRECTORY == EFI_FILE_DIRECTORY:

            self.StdOut.printf(u"One of files is directory.\r\n")
            FileHandle1[0].Close(FileHandle1)
            FileHandle2[0].Close(FileHandle2)
            return 0

        if fInfo1.FileSize != fInfo2.FileSize:
            self.StdOut.printf(u"Files are different in size.\r\n")
            FileHandle1[0].Close(FileHandle1)
            FileHandle2[0].Close(FileHandle2)
            return 0

        FlagDiff = False
        while True:

            BufferSize = EfiPy.UINT64(0x1000)
            TmpBuffer = (EfiPy.CHAR8 * 0x1000)()
            Status = FileHandle1[0].Read(FileHandle1, EfiPy.byref(BufferSize),
                                         EfiPy.byref(TmpBuffer))

            RetValue1 = (BufferSize.value, TmpBuffer)

            BufferSize = EfiPy.UINT64(0x1000)
            TmpBuffer = (EfiPy.CHAR8 * 0x1000)()
            Status = FileHandle2[0].Read(FileHandle2, EfiPy.byref(BufferSize),
                                         EfiPy.byref(TmpBuffer))

            RetValue2 = (BufferSize.value, TmpBuffer)

            if RetValue1 [0] != RetValue2 [0] or \
               RetValue1 [1] != RetValue2 [1]:
                FlagDiff = True
                break

            if RetValue1[0] == 0:
                break

        if FlagDiff == True:
            self.StdOut.printf(u"Files are different in conetent.\r\n")
        else:
            self.StdOut.printf(u"Files are the same.\r\n")

        FileHandle1[0].Close(FileHandle1)
        FileHandle2[0].Close(FileHandle2)

        return 0