LoadPbDllFromMemory & PB 10

Раздел посвящен программированию с использованием Power Basic.
Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

LoadPbDllFromMemory & PB 10

Сообщение Lapex » 30.05.2012 (Ср) 14:48

Всем привет!

Кому нибудь удалось заставить работать на PB10 знаменитую функцию LoadPbDllFromMemory от Семена Матусовского?
Код: Выделить всё
  ' ------- Additional API declarations ---------------
   %IMAGE_ORDINAL_FLAG = &H80000000

   TYPE IMAGE_IMPORT_BY_NAME
      Hint                   AS WORD
      ImpName                AS ASCIIZ * 254
   END TYPE

   TYPE IMAGE_IMPORT_DESCRIPTOR
      OriginalFirstThunk     AS DWORD
      TimeDateStamp          AS DWORD
      ForwarderChain         AS DWORD
      pName                  AS DWORD
      FirstThunk             AS DWORD
   END TYPE

   TYPE IMAGE_BASE_RELOCATION
      VirtualAddress AS DWORD
      SizeOfBlock AS DWORD
   END TYPE

   '===========================================================================
   DECLARE FUNCTION EntryPoint(BYVAL hInstance AS DWORD, BYVAL Reason AS DWORD, BYVAL Reserved AS DWORD) AS LONG

   FUNCTION GetProcAddressDirectly (BYVAL lpImageDosHeader AS IMAGE_DOS_HEADER PTR, FuncName AS ASCIIZ) AS DWORD
      DIM lpImageNtHeaders          AS LOCAL IMAGE_NT_HEADERS PTR
      DIM lpImageExportDirectory    AS LOCAL IMAGE_EXPORT_DIRECTORY PTR
      DIM lpNameOrdinals            AS LOCAL WORD PTR
      DIM lpFunctions               AS LOCAL DWORD PTR
      DIM lpExpFuncName             AS LOCAL ASCIIZ PTR
      DIM lpName                    AS LOCAL DWORD PTR
      DIM lpFuncName                AS ASCIIZ PTR
      DIM i                         AS LOCAL DWORD
      DIM j                         AS LOCAL DWORD

      IF @lpImageDosHeader.e_magic <> %IMAGE_DOS_SIGNATURE THEN FUNCTION = 1: EXIT FUNCTION ' invalid DOS signature
      lpImageNtHeaders = lpImageDosHeader + @lpImageDosHeader.e_lfanew
      IF @lpImageNtHeaders.Signature <> %IMAGE_NT_SIGNATURE THEN FUNCTION = 1: EXIT FUNCTION ' invalid NT signature
      IF @lpImageNtHeaders.FileHeader.SizeOfOptionalHeader <> SIZEOF(@lpImageNtHeaders.OptionalHeader) OR _
         @lpImageNtHeaders.OptionalHeader.Magic <> %IMAGE_NT_OPTIONAL_HDR32_MAGIC THEN EXIT FUNCTION

      lpImageExportDirectory = @lpImageNtHeaders.OptionalHeader.DataDirectory(%IMAGE_DIRECTORY_ENTRY_EXPORT).VirtualAddress
      IF lpImageExportDirectory = 0 THEN EXIT FUNCTION
      lpImageExportDirectory = lpImageExportDirectory + lpImageDosHeader

      lpNameOrdinals = @lpImageExportDirectory.AddressOfNameOrdinals + lpImageDosHeader
      lpName         = @lpImageExportDirectory.AddressOfNames        + lpImageDosHeader
      lpFunctions    = @lpImageExportDirectory.AddressOfFunctions    + lpImageDosHeader

      lpFuncName = VARPTR(FuncName)

      IF HIWRD(lpFuncName) THEN ' Name
         FOR i = 0 TO @lpImageExportDirectory.NumberOfFunctions - 1
            IF @lpFunctions[i] THEN
               FOR j = 0 TO @lpImageExportDirectory.NumberOfNames - 1
                  IF @lpNameOrdinals[j] = i THEN
                     lpExpFuncName = @lpName[j] + lpImageDosHeader
                     IF @lpExpFuncName = FuncName THEN FUNCTION = @lpFunctions[i] + lpImageDosHeader: EXIT FUNCTION
                  END IF
               NEXT
            END IF
         NEXT
      ELSE
         FOR i = 0 TO @lpImageExportDirectory.NumberOfFunctions - 1
            IF lpFuncName = @lpImageExportDirectory.nBase + i THEN
               IF  @lpFunctions[i] THEN FUNCTION = @lpFunctions[i] + lpImageDosHeader
               EXIT FUNCTION
            END IF
         NEXT
      END IF
   END FUNCTION

   FUNCTION LoadPbDllFromMemory (BYVAL lpRawDll AS DWORD, BYVAL RawDllSize AS DWORD, lpImageDll AS DWORD) AS DWORD
      DIM sSysInfo                  AS LOCAL SYSTEM_INFO
      DIM ImagePages                AS LOCAL DWORD
      DIM lpImageDosHeader          AS LOCAL IMAGE_DOS_HEADER PTR
      DIM lpImageNtHeaders          AS LOCAL IMAGE_NT_HEADERS PTR
      DIM lpImageSectionHeader      AS LOCAL IMAGE_SECTION_HEADER PTR
      DIM lpImageImportDescriptor   AS LOCAL IMAGE_IMPORT_DESCRIPTOR PTR
      DIM lpImageImportByName       AS LOCAL IMAGE_IMPORT_BY_NAME PTR
      DIM lpImageBaseRelocTable     AS LOCAL IMAGE_BASE_RELOCATION PTR
      DIM lpDllName                 AS LOCAL ASCIIZ PTR
      DIM szDllName                 AS LOCAL STRING
      DIM hDll                      AS LOCAL DWORD
      DIM lpFuncNameRef             AS LOCAL DWORD PTR
      DIM lpFuncAddr                AS LOCAL DWORD PTR
      DIM lpTypeOffset              AS WORD PTR
      DIM TpOffset                  AS WORD
      DIM lpLink                    AS LOCAL DWORD PTR
      DIM fOldProtect               AS LOCAL DWORD
      DIM i                         AS LOCAL DWORD
      DIM j                         AS LOCAL DWORD
      DIM k                         AS LOCAL DWORD
      DIM Protection()              AS LOCAL BYTE
      DIM Addr1                     AS LOCAL DWORD
      DIM Addr2                     AS LOCAL DWORD
      DIM Pg                        AS LOCAL DWORD
      DIM Pg1                       AS LOCAL DWORD
      DIM Pg2                       AS LOCAL DWORD

      lpImageDosHeader = lpRawDll
      IF RawDllSize < SIZEOF(IMAGE_DOS_HEADER) THEN FUNCTION = 1: EXIT FUNCTION
      IF @lpImageDosHeader.e_magic <> %IMAGE_DOS_SIGNATURE THEN FUNCTION = 1: EXIT FUNCTION ' invalid DOS signature
      IF RawDllSize < @lpImageDosHeader.e_lfanew + SIZEOF(IMAGE_NT_HEADERS) THEN FUNCTION = 1: EXIT FUNCTION
      lpImageNtHeaders = lpImageDosHeader + @lpImageDosHeader.e_lfanew
      IF @lpImageNtHeaders.Signature <> %IMAGE_NT_SIGNATURE THEN FUNCTION = 1: EXIT FUNCTION ' invalid NT signature
      IF @lpImageNtHeaders.FileHeader.SizeOfOptionalHeader <> SIZEOF(@lpImageNtHeaders.OptionalHeader) OR _
         @lpImageNtHeaders.OptionalHeader.Magic <> %IMAGE_NT_OPTIONAL_HDR32_MAGIC THEN FUNCTION = 1: EXIT FUNCTION
      IF @lpImageNtHeaders.FileHeader.NumberOfSections < 1 THEN FUNCTION = 1: EXIT FUNCTION

      FOR i = 0 TO %IMAGE_NUMBEROF_DIRECTORY_ENTRIES - 1
         IF @lpImageNtHeaders.OptionalHeader.DataDirectory(i).VirtualAddress <> 0 THEN
            SELECT CASE AS LONG i
               CASE %IMAGE_DIRECTORY_ENTRY_EXPORT     ' Export Directory
               CASE %IMAGE_DIRECTORY_ENTRY_IMPORT     ' Import Directory
               CASE %IMAGE_DIRECTORY_ENTRY_RESOURCE   ' Resource Directory
               CASE %IMAGE_DIRECTORY_ENTRY_BASERELOC  ' Base Relocation Table
               CASE %IMAGE_DIRECTORY_ENTRY_IAT        ' Import Address Table
               CASE ELSE ' Strange for PB
                  FUNCTION = 2: EXIT FUNCTION
           END SELECT
         END IF
      NEXT

      lpImageSectionHeader = lpImageNtHeaders + SIZEOF(IMAGE_NT_HEADERS)
      k = lpImageSectionHeader - lpImageDosHeader + SIZEOF(IMAGE_SECTION_HEADER) * @lpImageNtHeaders.FileHeader.NumberOfSections
      j = k
      FOR i = 0 TO @lpImageNtHeaders.FileHeader.NumberOfSections - 1
         j = MAX(j, @lpImageSectionHeader[i].VirtualAddress + @lpImageSectionHeader[i].SizeOfRawData)
      NEXT

      GetSystemInfo sSysInfo
      ImagePages = j \ sSysInfo.dwPageSize: IF (j MOD sSysInfo.dwPageSize) THEN INCR ImagePages
      lpImageDll = VirtualAlloc(BYVAL 0, CDWD(ImagePages * sSysInfo.dwPageSize), %MEM_COMMIT, %PAGE_EXECUTE_READWRITE)
      IF lpImageDll = 0 THEN FUNCTION = 5: EXIT FUNCTION

      MoveMemory BYVAL lpImageDll, BYVAL lpRawDll, k
      FOR i = 0 TO @lpImageNtHeaders.FileHeader.NumberOfSections - 1
         MoveMemory BYVAL CDWD(lpImageDll + @lpImageSectionHeader[i].VirtualAddress), _
                    BYVAL CDWD(lpRawDll + @lpImageSectionHeader[i].PointerToRawData), @lpImageSectionHeader[i].SizeOfRawData
      NEXT

      ' Switch to new image
      lpImageDosHeader = lpImageDll
      lpImageNtHeaders = lpImageDosHeader + @lpImageDosHeader.e_lfanew
      lpImageSectionHeader = lpImageNtHeaders + SIZEOF(IMAGE_NT_HEADERS)

      ' Import section
      lpImageImportDescriptor = @lpImageNtHeaders.OptionalHeader.DataDirectory(%IMAGE_DIRECTORY_ENTRY_IMPORT).VirtualAddress
      IF lpImageImportDescriptor <> 0 THEN
         lpImageImportDescriptor = lpImageImportDescriptor + lpImageDosHeader
         WHILE @lpImageImportDescriptor.OriginalFirstThunk <> 0 OR @lpImageImportDescriptor.FirstThunk <> 0 ' Dlls
            lpDllName = @lpImageImportDescriptor.pName + lpImageDosHeader
            szDllName = @lpDllName
            hDll = GetModuleHandle(BYVAL STRPTR(szDllName))
            IF hDll = 0 THEN hDll = LoadLibrary(BYVAL STRPTR(szDllName))
            IF hDll = 0 THEN FUNCTION = 2: EXIT FUNCTION ' Can't find
            lpFuncNameRef = @lpImageImportDescriptor.OriginalFirstThunk + lpImageDosHeader
            lpFuncAddr = @lpImageImportDescriptor.FirstThunk + lpImageDosHeader
            IF lpFuncNameRef = lpImageDosheader THEN lpFuncNameRef = lpFuncAddr
            WHILE @lpFuncNameRef <> 0
               lpImageImportByName = @lpFuncNameRef + lpImageDosHeader
               IF (@lpFuncNameRef AND %IMAGE_ORDINAL_FLAG) THEN _
                  @lpFuncAddr = GetProcAddress(hDll, BYVAL @lpFuncNameRef AND &HFFFF???) ELSE _
                  @lpFuncAddr = GetProcAddress(hDll, @lpImageImportByName.ImpName)
               IF @lpFuncAddr = 0 THEN FUNCTION = 2: EXIT FUNCTION
               INCR lpFuncAddr
               INCR lpFuncNameRef
            WEND
            INCR lpImageImportDescriptor
         LOOP
      END IF

      lpImageBaseRelocTable = @lpImageNtHeaders.OptionalHeader.DataDirectory(%IMAGE_DIRECTORY_ENTRY_BASERELOC).VirtualAddress
      IF lpImageBaseRelocTable <> 0 THEN
         lpImageBaseRelocTable = lpImageBaseRelocTable + lpImageDosHeader
         WHILE @lpImageBaseRelocTable.VirtualAddress <> 0
            lpTypeOffset = lpImageBaseRelocTable + SIZEOF(IMAGE_BASE_RELOCATION)
            WHILE lpTypeOffset < lpImageBaseRelocTable + @lpImageBaseRelocTable.SizeOfBlock
               TpOffset = @lpTypeOffset AND &HF000??
               IF TpOffset = &H3000 THEN
                  lpLink = lpImageDosHeader + @lpImageBaseRelocTable.VirtualAddress + (@lpTypeOffset AND &HFFF??)
                  @lpLink = @lpLink - @lpImageNtHeaders.OptionalHeader.ImageBase + lpImageDosHeader
               ELSEIF TpOffSet = 0 THEN
               ELSE
                  FUNCTION = 3: EXIT FUNCTION ' Uknown type
               END IF
               INCR lpTypeOffset
            WEND
            lpImageBaseRelocTable = lpImageBaseRelocTable + @lpImageBaseRelocTable.SizeOfBlock
         WEND
      END IF

      REDIM Protection(ImagePages - 1)

      FOR i = 0 TO @lpImageNtHeaders.FileHeader.NumberOfSections
         IF i = @lpImageNtHeaders.FileHeader.NumberOfSections THEN
            Addr1 = 0: Addr2 = k: j = &H60000000??? ' %PAGE_EXECUTE_READ
         ELSE
            Addr1 = @lpImageSectionHeader[i].VirtualAddress
            Addr2 = @lpImageSectionHeader[i].SizeOfRawData
            j = @lpImageSectionHeader[i].Characteristics
         END IF
         Addr2 = Addr1 + Addr2 - 1
         Pg1 = Addr1 \ sSysInfo.dwPageSize
         Pg2 = Addr2 \ sSysInfo.dwPageSize
         FOR Pg = Pg1 TO Pg2
            IF (j AND &H20000000???) THEN Protection(Pg) = Protection(Pg) OR 1 ' Execute
            IF (j AND &H40000000???) THEN Protection(Pg) = Protection(Pg) OR 2 ' Read
            IF (j AND &H80000000???) THEN Protection(Pg) = Protection(Pg) OR 4 ' Write
         NEXT
      NEXT
      Addr1 = lpImageDosHeader
      FOR Pg = 0 TO ImagePages - 1
         SELECT CASE AS LONG Protection(Pg)
            CASE 2: fOldProtect = %PAGE_READONLY
            CASE 3: fOldProtect = %PAGE_EXECUTE_READ
            CASE 6: fOldProtect = %PAGE_READWRITE
            CASE ELSE: fOldProtect = %PAGE_EXECUTE_READWRITE ' Ignore strange combinations
         END SELECT
         IF fOldProtect <> %PAGE_EXECUTE_READWRITE THEN _
            IF VirtualProtect (BYVAL Addr1, sSysInfo.dwPageSize, fOldProtect, fOldProtect) = 0 THEN FUNCTION = 4: EXIT FUNCTION
         Addr1 = Addr1 + sSysInfo.dwPageSize
      NEXT

      i = @lpImageNtHeaders.OptionalHeader.AddressOfEntryPoint + lpImageDosHeader
      CALL DWORD i USING EntryPoint (lpImageDosHeader, %DLL_PROCESS_ATTACH, 0)
   END FUNCTION

   FUNCTION UnloadPbDllFromMemory (BYVAL lpImageDosHeader AS IMAGE_DOS_HEADER PTR) AS DWORD
      DIM lpImageNtHeaders          AS LOCAL IMAGE_NT_HEADERS PTR
      DIM i                         AS LOCAL DWORD

      lpImageNtHeaders = lpImageDosHeader + @lpImageDosHeader.e_lfanew
      i = @lpImageNtHeaders.OptionalHeader.AddressOfEntryPoint + lpImageDosHeader
      CALL DWORD i USING EntryPoint (lpImageDosHeader, %DLL_PROCESS_DETACH, 0)
      FUNCTION = VirtualFree (BYVAL lpImageDosHeader, 0, %MEM_RELEASE)
   END FUNCTION

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: LoadPbDllFromMemory & PB 10

Сообщение jangle » 01.06.2012 (Пт) 9:30

А она что не работает или не компилится?

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Re: LoadPbDllFromMemory & PB 10

Сообщение Lapex » 01.06.2012 (Пт) 13:00

[исправлено] 01.06.2012 (Пт) 17:42
C хидерами от PB9 компилится - работает.
С родными хидерами - не компилится.

Пожалуйста помогите с адаптацией под хидеры PB10.

Спасибо!

[добавлено] 01.06.2012 (Пт) 19:32
Решил проблему путем переименования типов в коде Матусовского, чтобы исключить конфликт с типами указанными в хидерах PB10

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: LoadPbDllFromMemory & PB 10

Сообщение jangle » 02.06.2012 (Сб) 18:50

Может выложишь исправленный код?

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Re: LoadPbDllFromMemory & PB 10

Сообщение Lapex » 02.06.2012 (Сб) 21:48

Переименовал типы:
    IMAGE_IMPORT_BY_NAME_PB9
    IMAGE_IMPORT_DESCRIPTOR_PB9
    IMAGE_BASE_RELOCATION_PB9
Исправленный код:
Код: Выделить всё
  ' ------- Additional API declarations ---------------
   %IMAGE_ORDINAL_FLAG                     = &H80000000

   Type IMAGE_IMPORT_BY_NAME_PB9
      Hint                   As Word
      ImpName                As AsciiZ * 254
   End Type

   Type IMAGE_IMPORT_DESCRIPTOR_PB9
      OriginalFirstThunk     As Dword
      TimeDateStamp          As Dword
      ForwarderChain         As Dword
      pName                  As Dword
      FirstThunk             As Dword
   End Type

   Type IMAGE_BASE_RELOCATION_PB9
      VirtualAddress As Dword
      SizeOfBlock As Dword
   End Type

   '===========================================================================
   Declare Function EntryPoint(ByVal hInstance As Dword, ByVal Reason As Dword, ByVal Reserved As Dword) As Long

   Function GetProcAddressDirectly (ByVal lpImageDosHeader As IMAGE_DOS_HEADER Ptr, FuncName As AsciiZ) As Dword
      Dim lpImageNtHeaders          As Local IMAGE_NT_HEADERS Ptr
      Dim lpImageExportDirectory    As Local IMAGE_EXPORT_DIRECTORY Ptr
      Dim lpNameOrdinals            As Local Word Ptr
      Dim lpFunctions               As Local Dword Ptr
      Dim lpExpFuncName             As Local AsciiZ Ptr
      Dim lpName                    As Local Dword Ptr
      Dim lpFuncName                As AsciiZ Ptr
      Dim i                         As Local Dword
      Dim j                         As Local Dword

      If @lpImageDosHeader.e_magic <> %IMAGE_DOS_SIGNATURE Then Function = 1: Exit Function ' invalid DOS signature
      lpImageNtHeaders = lpImageDosHeader + @lpImageDosHeader.e_lfanew
      If @lpImageNtHeaders.Signature <> %IMAGE_NT_SIGNATURE Then Function = 1: Exit Function ' invalid NT signature
      If @lpImageNtHeaders.FileHeader.SizeOfOptionalHeader <> SizeOf(@lpImageNtHeaders.OptionalHeader) Or _
         @lpImageNtHeaders.OptionalHeader.Magic <> %IMAGE_NT_OPTIONAL_HDR32_MAGIC Then Exit Function

      lpImageExportDirectory = @lpImageNtHeaders.OptionalHeader.DataDirectory(%IMAGE_DIRECTORY_ENTRY_EXPORT).VirtualAddress
      If lpImageExportDirectory = 0 Then Exit Function
      lpImageExportDirectory = lpImageExportDirectory + lpImageDosHeader

      lpNameOrdinals = @lpImageExportDirectory.AddressOfNameOrdinals + lpImageDosHeader
      lpName         = @lpImageExportDirectory.AddressOfNames        + lpImageDosHeader
      lpFunctions    = @lpImageExportDirectory.AddressOfFunctions    + lpImageDosHeader

      lpFuncName = VarPtr(FuncName)

      If HiWrd(lpFuncName) Then ' Name
         For i = 0 To @lpImageExportDirectory.NumberOfFunctions - 1
            If @lpFunctions[i] Then
               For j = 0 To @lpImageExportDirectory.NumberOfNames - 1
                  If @lpNameOrdinals[j] = i Then
                     lpExpFuncName = @lpName[j] + lpImageDosHeader
                     If @lpExpFuncName = FuncName Then Function = @lpFunctions[i] + lpImageDosHeader: Exit Function
                  End If
               Next
            End If
         Next
      Else
         For i = 0 To @lpImageExportDirectory.NumberOfFunctions - 1
            If lpFuncName = @lpImageExportDirectory.nBase + i Then
               If  @lpFunctions[i] Then Function = @lpFunctions[i] + lpImageDosHeader
               Exit Function
            End If
         Next
      End If
   End Function

   Function LoadPbDllFromMemory (ByVal lpRawDll As Dword, ByVal RawDllSize As Dword, lpImageDll As Dword) As Dword
      Dim sSysInfo                  As Local SYSTEM_INFO
      Dim ImagePages                As Local Dword
      Dim lpImageDosHeader          As Local IMAGE_DOS_HEADER Ptr
      Dim lpImageNtHeaders          As Local IMAGE_NT_HEADERS Ptr
      Dim lpImageSectionHeader      As Local IMAGE_SECTION_HEADER Ptr
      Dim lpImageImportDescriptor   As Local IMAGE_IMPORT_DESCRIPTOR_PB9 Ptr
      Dim lpImageImportByName       As Local IMAGE_IMPORT_BY_NAME_PB9 Ptr
      Dim lpImageBaseRelocTable     As Local IMAGE_BASE_RELOCATION_PB9 Ptr
      Dim lpDllName                 As Local AsciiZ Ptr
      Dim szDllName                 As Local String
      Dim hDll                      As Local Dword
      Dim lpFuncNameRef             As Local Dword Ptr
      Dim lpFuncAddr                As Local Dword Ptr
      Dim lpTypeOffset              As Word Ptr
      Dim TpOffset                  As Word
      Dim lpLink                    As Local Dword Ptr
      Dim fOldProtect               As Local Dword
      Dim i                         As Local Dword
      Dim j                         As Local Dword
      Dim k                         As Local Dword
      Dim Protection()              As Local Byte
      Dim Addr1                     As Local Dword
      Dim Addr2                     As Local Dword
      Dim Pg                        As Local Dword
      Dim Pg1                       As Local Dword
      Dim Pg2                       As Local Dword

      lpImageDosHeader = lpRawDll
      If RawDllSize < SizeOf(IMAGE_DOS_HEADER) Then Function = 1: Exit Function
      If @lpImageDosHeader.e_magic <> %IMAGE_DOS_SIGNATURE Then Function = 1: Exit Function ' invalid DOS signature
      If RawDllSize < @lpImageDosHeader.e_lfanew + SizeOf(IMAGE_NT_HEADERS) Then Function = 1: Exit Function
      lpImageNtHeaders = lpImageDosHeader + @lpImageDosHeader.e_lfanew
      If @lpImageNtHeaders.Signature <> %IMAGE_NT_SIGNATURE Then Function = 1: Exit Function ' invalid NT signature
      If @lpImageNtHeaders.FileHeader.SizeOfOptionalHeader <> SizeOf(@lpImageNtHeaders.OptionalHeader) Or _
         @lpImageNtHeaders.OptionalHeader.Magic <> %IMAGE_NT_OPTIONAL_HDR32_MAGIC Then Function = 1: Exit Function
      If @lpImageNtHeaders.FileHeader.NumberOfSections < 1 Then Function = 1: Exit Function

      For i = 0 To %IMAGE_NUMBEROF_DIRECTORY_ENTRIES - 1
         If @lpImageNtHeaders.OptionalHeader.DataDirectory(i).VirtualAddress <> 0 Then
            Select Case As Long i
               Case %IMAGE_DIRECTORY_ENTRY_EXPORT     ' Export Directory
               Case %IMAGE_DIRECTORY_ENTRY_IMPORT     ' Import Directory
               Case %IMAGE_DIRECTORY_ENTRY_RESOURCE   ' Resource Directory
               Case %IMAGE_DIRECTORY_ENTRY_BASERELOC  ' Base Relocation Table
               Case %IMAGE_DIRECTORY_ENTRY_IAT        ' Import Address Table
               Case Else ' Strange for PB
                  Function = 2: Exit Function
           End Select
         End If
      Next

      lpImageSectionHeader = lpImageNtHeaders + SizeOf(IMAGE_NT_HEADERS)
      k = lpImageSectionHeader - lpImageDosHeader + SizeOf(IMAGE_SECTION_HEADER) * @lpImageNtHeaders.FileHeader.NumberOfSections
      j = k
      For i = 0 To @lpImageNtHeaders.FileHeader.NumberOfSections - 1
         j = Max(j, @lpImageSectionHeader[i].VirtualAddress + @lpImageSectionHeader[i].SizeOfRawData)
      Next

      GetSystemInfo sSysInfo
      ImagePages = j \ sSysInfo.dwPageSize: If (j Mod sSysInfo.dwPageSize) Then Incr ImagePages
      lpImageDll = VirtualAlloc(ByVal 0, CDwd(ImagePages * sSysInfo.dwPageSize), %MEM_COMMIT, %PAGE_EXECUTE_READWRITE)
      If lpImageDll = 0 Then Function = 5: Exit Function

      MoveMemory ByVal lpImageDll, ByVal lpRawDll, k
      For i = 0 To @lpImageNtHeaders.FileHeader.NumberOfSections - 1
         MoveMemory ByVal CDwd(lpImageDll + @lpImageSectionHeader[i].VirtualAddress), _
                    ByVal CDwd(lpRawDll + @lpImageSectionHeader[i].PointerToRawData), @lpImageSectionHeader[i].SizeOfRawData
      Next

      ' Switch to new image
      lpImageDosHeader = lpImageDll
      lpImageNtHeaders = lpImageDosHeader + @lpImageDosHeader.e_lfanew
      lpImageSectionHeader = lpImageNtHeaders + SizeOf(IMAGE_NT_HEADERS)

      ' Import section
      lpImageImportDescriptor = @lpImageNtHeaders.OptionalHeader.DataDirectory(%IMAGE_DIRECTORY_ENTRY_IMPORT).VirtualAddress
      If lpImageImportDescriptor <> 0 Then
         lpImageImportDescriptor = lpImageImportDescriptor + lpImageDosHeader
         While @lpImageImportDescriptor.OriginalFirstThunk <> 0 Or @lpImageImportDescriptor.FirstThunk <> 0 ' Dlls
            lpDllName = @lpImageImportDescriptor.pName + lpImageDosHeader
            szDllName = @lpDllName
            hDll = GetModuleHandle(ByVal StrPtr(szDllName))
            If hDll = 0 Then hDll = LoadLibrary(ByVal StrPtr(szDllName))
            If hDll = 0 Then Function = 2: Exit Function ' Can't find
            lpFuncNameRef = @lpImageImportDescriptor.OriginalFirstThunk + lpImageDosHeader
            lpFuncAddr = @lpImageImportDescriptor.FirstThunk + lpImageDosHeader
            If lpFuncNameRef = lpImageDosheader Then lpFuncNameRef = lpFuncAddr
            While @lpFuncNameRef <> 0
               lpImageImportByName = @lpFuncNameRef + lpImageDosHeader
               If (@lpFuncNameRef And %IMAGE_ORDINAL_FLAG) Then _
                  @lpFuncAddr = GetProcAddress(hDll, ByVal @lpFuncNameRef And &HFFFF???) Else _
                  @lpFuncAddr = GetProcAddress(hDll, @lpImageImportByName.ImpName)
               If @lpFuncAddr = 0 Then Function = 2: Exit Function
               Incr lpFuncAddr
               Incr lpFuncNameRef
            Wend
            Incr lpImageImportDescriptor
         Loop
      End If

      lpImageBaseRelocTable = @lpImageNtHeaders.OptionalHeader.DataDirectory(%IMAGE_DIRECTORY_ENTRY_BASERELOC).VirtualAddress
      If lpImageBaseRelocTable <> 0 Then
         lpImageBaseRelocTable = lpImageBaseRelocTable + lpImageDosHeader
         While @lpImageBaseRelocTable.VirtualAddress <> 0
            lpTypeOffset = lpImageBaseRelocTable + SizeOf(IMAGE_BASE_RELOCATION_PB9)
            While lpTypeOffset < lpImageBaseRelocTable + @lpImageBaseRelocTable.SizeOfBlock
               TpOffset = @lpTypeOffset And &HF000??
               If TpOffset = &H3000 Then
                  lpLink = lpImageDosHeader + @lpImageBaseRelocTable.VirtualAddress + (@lpTypeOffset And &HFFF??)
                  @lpLink = @lpLink - @lpImageNtHeaders.OptionalHeader.ImageBase + lpImageDosHeader
               ElseIf TpOffSet = 0 Then
               Else
                  Function = 3: Exit Function ' Uknown type
               End If
               Incr lpTypeOffset
            Wend
            lpImageBaseRelocTable = lpImageBaseRelocTable + @lpImageBaseRelocTable.SizeOfBlock
         Wend
      End If

      ReDim Protection(ImagePages - 1)

      For i = 0 To @lpImageNtHeaders.FileHeader.NumberOfSections
         If i = @lpImageNtHeaders.FileHeader.NumberOfSections Then
            Addr1 = 0: Addr2 = k: j = &H60000000??? ' %PAGE_EXECUTE_READ
         Else
            Addr1 = @lpImageSectionHeader[i].VirtualAddress
            Addr2 = @lpImageSectionHeader[i].SizeOfRawData
            j = @lpImageSectionHeader[i].Characteristics
         End If
         Addr2 = Addr1 + Addr2 - 1
         Pg1 = Addr1 \ sSysInfo.dwPageSize
         Pg2 = Addr2 \ sSysInfo.dwPageSize
         For Pg = Pg1 To Pg2
            If (j And &H20000000???) Then Protection(Pg) = Protection(Pg) Or 1 ' Execute
            If (j And &H40000000???) Then Protection(Pg) = Protection(Pg) Or 2 ' Read
            If (j And &H80000000???) Then Protection(Pg) = Protection(Pg) Or 4 ' Write
         Next
      Next
      Addr1 = lpImageDosHeader
      For Pg = 0 To ImagePages - 1
         Select Case As Long Protection(Pg)
            Case 2: fOldProtect = %PAGE_READONLY
            Case 3: fOldProtect = %PAGE_EXECUTE_READ
            Case 6: fOldProtect = %PAGE_READWRITE
            Case Else: fOldProtect = %PAGE_EXECUTE_READWRITE ' Ignore strange combinations
         End Select
         If fOldProtect <> %PAGE_EXECUTE_READWRITE Then _
            If VirtualProtect (ByVal Addr1, sSysInfo.dwPageSize, fOldProtect, fOldProtect) = 0 Then Function = 4: Exit Function
         Addr1 = Addr1 + sSysInfo.dwPageSize
      Next

      i = @lpImageNtHeaders.OptionalHeader.AddressOfEntryPoint + lpImageDosHeader
      Call Dword i Using EntryPoint (lpImageDosHeader, %DLL_PROCESS_ATTACH, 0)
   End Function

   Function UnloadPbDllFromMemory (ByVal lpImageDosHeader As IMAGE_DOS_HEADER Ptr) As Dword
      Dim lpImageNtHeaders          As Local IMAGE_NT_HEADERS Ptr
      Dim i                         As Local Dword

      lpImageNtHeaders = lpImageDosHeader + @lpImageDosHeader.e_lfanew
      i = @lpImageNtHeaders.OptionalHeader.AddressOfEntryPoint + lpImageDosHeader
      Call Dword i Using EntryPoint (lpImageDosHeader, %DLL_PROCESS_DETACH, 0)
      Function = VirtualFree (ByVal lpImageDosHeader, 0, %MEM_RELEASE)
   End Function

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Re: LoadPbDllFromMemory & PB 10

Сообщение Lapex » 04.06.2012 (Пн) 22:18

Вообщем у меня проблема с LoadPbDllFromMemory в Win7 :(

Если в PB создаю для теста dll с одной функцией, то эта dll нормально работает в Win7.
Пробую использовать другие dll - НЕ работает в Win7 (hLib равен 0), а в WinXP - работает.

Пробовал запускать от имени администратора и в режиме совместимости - НЕ работает :(

Может есть какие либо идеи?

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: LoadPbDllFromMemory & PB 10

Сообщение jangle » 05.06.2012 (Вт) 9:51

Lapex писал(а):Может есть какие либо идеи?


Дебажить код в Win7 или писать логи. Тогда поймешь почему не работает.

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Re: LoadPbDllFromMemory & PB 10

Сообщение Lapex » 05.06.2012 (Вт) 10:44

Дебажить код в Win7 или писать логи. Тогда поймешь почему не работает.

Спасибо за совет, но мне это ничего не даст.
Для меня код Матусовского - это черный ящик, в котором я к сожалению ничего не понимаю (использую как есть), а проблема заключается именно в коде Матусовского:
Dll не загружается - lpImageDll = 0 (Win7)

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: LoadPbDllFromMemory & PB 10

Сообщение jangle » 05.06.2012 (Вт) 13:35

Lapex писал(а):
Дебажить код в Win7 или писать логи. Тогда поймешь почему не работает.

Спасибо за совет, но мне это ничего не даст.
Для меня код Матусовского - это черный ящик, в котором я к сожалению ничего не понимаю (использую как есть), а проблема заключается именно в коде Матусовского:
Dll не загружается - lpImageDll = 0 (Win7)


Ну так изучи код, если собрался его использовать. Иначе никак нельзя. "Черные ящики" в проекте, это мины замедленного действия, на одной ты и подорвался. Можно сравнить логи Dll которая грузится с логами Dll которая не грузится, и сразу станет понятно место ошибки.

DarkMachine
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 51
Зарегистрирован: 24.02.2012 (Пт) 15:58

Re: LoadPbDllFromMemory & PB 10

Сообщение DarkMachine » 07.06.2012 (Чт) 14:27

По моему кто то на родном форуме уже сталкивался с этим. Поищи решение на офиц. форуме, если лопату держать неохота :)

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: LoadPbDllFromMemory & PB 10

Сообщение jangle » 08.06.2012 (Пт) 11:56

DarkMachine писал(а):По моему кто то на родном форуме уже сталкивался с этим. Поищи решение на офиц. форуме, если лопату держать неохота :)


Поискал и ничего не нашел там.

DarkMachine
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 51
Зарегистрирован: 24.02.2012 (Пт) 15:58

Re: LoadPbDllFromMemory & PB 10

Сообщение DarkMachine » 08.06.2012 (Пт) 13:38

Надо проверить утилитой Pecompact2 на предмет каких либо проблем...
Можешь проект закинуть в ПМ или сюда?

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Re: LoadPbDllFromMemory & PB 10

Сообщение Lapex » 08.06.2012 (Пт) 21:39

Пробую использовать другие dll - НЕ работает в Win7 (hLib равен 0), а в WinXP - работает.

Доэкспериментировался, теперь не могу воспроизвести вышеуказанную ситуацию :)
Возможно проблема заключается в "новых" dll-ках, т.к. со "старыми" проблем нет- работают и в XP и W7.
Сбила с толку вышеуказанная ситуация, которую больше не смог воспроизвести.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 08.06.2012 (Пт) 23:42

На всякий случай. С битностью всё нормально? Т. е. она совпадает?


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24

    TopList