1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Использование winapi в fasm(32-64)

Тема в разделе "WASM.BEGINNERS", создана пользователем Demon13, 7 июн 2019.

  1. Demon13

    Demon13 Member

    Публикаций:
    0
    Регистрация:
    16 ноя 2018
    Сообщения:
    30
    Здравствуйте, я столкнулся с необходимостью использовать функции из 64 битной dll в 32 битном приложении. Я узнал, что могу использовать use32 и use64 в fasm. Но при их использовании получал ошибки в вызовах winapi. Как правильно вызвать winapi в 64 битном режиме в fasm в 32 битном приложении используя use64 и use32?
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.149
    Это директивы для ручной установки разрядности, если тебе надо в 32битное приложение красиво подключить 64битный код и наоборот (например для кода, инжектируемого в другой процесс). К использованию винапи из 64бит длл в 32бит приложении это ни малейшего отношения не имеет. Точно так же как директива org не закрепляет код за определенным адресом, а только дает генерировать код так, будто он находится там.
     
  3. Demon13

    Demon13 Member

    Публикаций:
    0
    Регистрация:
    16 ноя 2018
    Сообщения:
    30
    Спасибо, простите мне мою некомпетентность, но так как же правильно вызвать winapi из 64 битной dll в 32 битное приложение?
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.149
  5. Demon13

    Demon13 Member

    Публикаций:
    0
    Регистрация:
    16 ноя 2018
    Сообщения:
    30
    Спасибо
     
  6. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    129
    Demon13, если в планах использовать 64-битные библиотеки для 32-бит программ, то не получится - у них параметры функциям передаются по разному (см.скрин). Попробуй положить рядом со-своей программой соответствующую либу из 32-битной оси, и загрузить её динамически - может прокатит. После сборки, можешь занопить динамику, и винда должна подцепить твою прожку как WOW64. Хотя сам не пробовал.. а только в теории.

    hiew_32.png
     
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.381
    Что то последнее время вопросы дебильные. Как можно спрашивать про асм, НЕ ПОНИМАЯ фундаментальных процессорных режимов!? :sarcastic:

    Compatibility mode".

    IA BASIC ARCH, 3: BASIC EXECUTION ENVIRONMENT

    Курить до посинения.
     
  8. trsoft

    trsoft Member

    Публикаций:
    0
    Регистрация:
    18 июл 2018
    Сообщения:
    112
    Demon13, по-умолчанию все параметры передаются через стек, в 32-битном режиме используются 32-разрядные регистры, поэтому загонять в стек придется вручную и выбирать тоже вручную , не могу сказать про 64-битное возвращаемое значение в rax (eax).
     
  9. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    540
    Параметры в 64 битном режиме передаются по соглашению x64. К примеру вот пример кода (правда на VB6) для вызова 64 битных функций из ntdll (CallX64) из 32 битного процесса.
    Код (Visual Basic):
    1. Option Explicit
    2.  
    3. Private Const ProcessBasicInformation As Long = 0
    4. Private Const MEM_RESERVE             As Long = &H2000&
    5. Private Const MEM_COMMIT              As Long = &H1000&
    6. Private Const MEM_RELEASE             As Long = &H8000&
    7. Private Const PAGE_READWRITE          As Long = 4&
    8. Private Const FADF_AUTO               As Long = 1
    9. Private Const PAGE_EXECUTE_READWRITE  As Long = &H40&
    10.  
    11. Private Type SAFEARRAYBOUND
    12.     cElements                       As Long
    13.     lLbound                         As Long
    14. End Type
    15.  
    16. Private Type SAFEARRAY
    17.     cDims                           As Integer
    18.     fFeatures                       As Integer
    19.     cbElements                      As Long
    20.     cLocks                          As Long
    21.     pvData                          As Long
    22.     Bounds                          As SAFEARRAYBOUND
    23. End Type
    24.  
    25. Private Type LARGE_INTEGER
    26.     lowpart                         As Long
    27.     highpart                        As Long
    28. End Type
    29.  
    30. Private Type UNICODE_STRING64
    31.     Length                          As Integer
    32.     MaxLength                       As Integer
    33.     lPad                            As Long
    34.     lpBuffer                        As LARGE_INTEGER
    35. End Type
    36.  
    37. Private Type IMAGE_DATA_DIRECTORY
    38.     VirtualAddress                  As Long
    39.     Size                            As Long
    40. End Type
    41.  
    42. Private Type PROCESS_BASIC_INFORMATION64
    43.     ExitStatus                      As Long
    44.     Reserved0                       As Long
    45.     PebBaseAddress                  As LARGE_INTEGER
    46.     AffinityMask                    As LARGE_INTEGER
    47.     BasePriority                    As Long
    48.     Reserved1                       As Long
    49.     uUniqueProcessId                As LARGE_INTEGER
    50.     uInheritedFromUniqueProcessId   As LARGE_INTEGER
    51. End Type
    52.  
    53. Private Type QUOTA_LIMITS64
    54.     PagedPoolLimit                  As LARGE_INTEGER
    55.     NonPagedPoolLimit               As LARGE_INTEGER
    56.     MinimumWorkingSetSize           As LARGE_INTEGER
    57.     MaximumWorkingSetSize           As LARGE_INTEGER
    58.     PagefileLimit                   As LARGE_INTEGER
    59.     TimeLimit                       As LARGE_INTEGER
    60. End Type
    61.  
    62. Private Declare Function NtWow64QueryInformationProcess64 Lib "ntdll" ( _
    63.                          ByVal hProcess As Long, _
    64.                          ByVal ProcessInformationClass As Long, _
    65.                          ByRef pProcessInformation As Any, _
    66.                          ByVal uProcessInformationLength As Long, _
    67.                          ByRef puReturnLength As Long) As Long
    68. Private Declare Function NtWow64ReadVirtualMemory64 Lib "ntdll" ( _
    69.                          ByVal hProcess As Long, _
    70.                          ByVal BaseAddressL As Long, _
    71.                          ByVal BaseAddressH As Long, _
    72.                          ByRef Buffer As Any, _
    73.                          ByVal BufferLengthL As Long, _
    74.                          ByVal BufferLengthH As Long, _
    75.                          ByRef ReturnLength As LARGE_INTEGER) As Long
    76. Private Declare Function GetMem8 Lib "msvbvm60" ( _
    77.                          ByRef Src As Any, _
    78.                          ByRef Dst As Any) As Long
    79. Private Declare Function GetMem4 Lib "msvbvm60" ( _
    80.                          ByRef Src As Any, _
    81.                          ByRef Dst As Any) As Long
    82. Private Declare Function GetMem2 Lib "msvbvm60" ( _
    83.                          ByRef Src As Any, _
    84.                          ByRef Dst As Any) As Long
    85. Private Declare Function GetMem1 Lib "msvbvm60" ( _
    86.                          ByRef Src As Any, _
    87.                          ByRef Dst As Any) As Long
    88. Private Declare Function VirtualAlloc Lib "kernel32" ( _
    89.                          ByVal lpAddress As Long, _
    90.                          ByVal dwSize As Long, _
    91.                          ByVal flAllocationType As Long, _
    92.                          ByVal flProtect As Long) As Long
    93. Private Declare Function VirtualFree Lib "kernel32" ( _
    94.                          ByVal lpAddress As Long, _
    95.                          ByVal dwSize As Long, _
    96.                          ByVal dwFreeType As Long) As Long
    97. Private Declare Function DispCallFunc Lib "oleaut32.dll" ( _
    98.                          ByRef pvInstance As Any, _
    99.                          ByVal oVft As Long, _
    100.                          ByVal cc As Long, _
    101.                          ByVal vtReturn As VbVarType, _
    102.                          ByVal cActuals As Long, _
    103.                          ByRef prgvt As Any, _
    104.                          ByRef prgpvarg As Any, _
    105.                          ByRef pvargResult As Variant) As Long
    106. Private Declare Sub MoveArray Lib "msvbvm60" _
    107.                     Alias "__vbaAryMove" ( _
    108.                     ByRef Destination() As Any, _
    109.                     ByRef Source As Any)
    110.                
    111. Private mtProcessInfo64             As PROCESS_BASIC_INFORMATION64
    112. Private mpfnNtAllocateVirtualMemory As LARGE_INTEGER
    113. Private mpCode                      As Long
    114.  
    115. Private Sub Form_Load()
    116.     Dim lStatus                     As Long
    117.     Dim tQuota                      As QUOTA_LIMITS64
    118.     Dim lRet                        As Long
    119.     Dim pfnNtSetInformationProcess  As LARGE_INTEGER
    120.  
    121.     lStatus = NtWow64QueryInformationProcess64(-1, ProcessBasicInformation, mtProcessInfo64, Len(mtProcessInfo64), 0)
    122.  
    123.     If lStatus < 0 Then
    124.         MsgBox "Error 0x" & Hex$(lStatus)
    125.         Exit Sub
    126.     End If
    127.  
    128.     mpfnNtAllocateVirtualMemory = GetProcAddress64(GetNtDll_Handle, "NtAllocateVirtualMemory")
    129.     pfnNtSetInformationProcess = GetProcAddress64(GetNtDll_Handle, "NtQueryInformationProcess")
    130.  
    131.     mpCode = VirtualAlloc(0, 4096, MEM_COMMIT Or MEM_RESERVE, PAGE_EXECUTE_READWRITE)
    132.  
    133.     Dim cA1 As Currency
    134.     Dim cA2 As Currency
    135.     Dim tRet    As LARGE_INTEGER
    136.  
    137.     GetMem4 VarPtr(tQuota), cA1
    138.     GetMem4 VarPtr(tRet), cA2
    139.  
    140.     lRet = CallX64(pfnNtSetInformationProcess, -0.0001@, 0.0001@, cA1, CCur(Len(tQuota) / 10000@), cA2)
    141.  
    142.     pfnNtSetInformationProcess = GetProcAddress64(GetNtDll_Handle, "NtSetInformationProcess")
    143.  
    144.     tQuota.MaximumWorkingSetSize.highpart = -1
    145.     tQuota.MaximumWorkingSetSize.lowpart = -1
    146.  
    147.     tQuota.MinimumWorkingSetSize.highpart = -1
    148.     tQuota.MinimumWorkingSetSize.lowpart = -1
    149.  
    150.     lRet = CallX64(pfnNtSetInformationProcess, -0.0001@, 0.0001@, cA1, CCur(Len(tQuota) / 10000@))
    151.  
    152.     AllocMemory 0, 1
    153.  
    154. End Sub
    155.  
    156. Private Sub AllocMemory( _
    157.             ByVal lSizeL As Long, _
    158.             ByVal lSizeH As Long)
    159.     Dim pAddress    As LARGE_INTEGER
    160.     Dim ppAddress   As LARGE_INTEGER
    161.     Dim cppAddress  As Currency
    162.     Dim cpSize      As Currency
    163.  
    164.     ppAddress.lowpart = VarPtr(pAddress):   GetMem8 ppAddress, cppAddress
    165.     GetMem8 VarPtr(lSizeL), cpSize
    166.  
    167.     CallX64 mpfnNtAllocateVirtualMemory, -0.0001@, cppAddress, 0@, cpSize, MEM_COMMIT Or MEM_RESERVE, PAGE_READWRITE
    168.  
    169. End Sub
    170.  
    171. ' // Call x64
    172. Private Function CallX64( _
    173.                  ByRef pfn As LARGE_INTEGER, _
    174.                  ParamArray vArgs() As Variant) As Long
    175.     Dim bCode()     As Byte
    176.     Dim vArg        As Variant
    177.     Dim lIndex      As Long
    178.     Dim lByteIdx    As Long
    179.     Dim lArgs       As Long
    180.     Dim tArrDesc    As SAFEARRAY
    181.     Dim vRet        As Variant
    182.  
    183.     tArrDesc.cbElements = 1
    184.     tArrDesc.cDims = 1
    185.     tArrDesc.fFeatures = FADF_AUTO
    186.     tArrDesc.Bounds.cElements = 4096
    187.     tArrDesc.pvData = mpCode
    188.  
    189.     MoveArray bCode(), VarPtr(tArrDesc)
    190.  
    191.     ' // Make x64call
    192.  
    193.     ' // JMP FAR 33:ADDR
    194.     bCode(0) = &HEA
    195.  
    196.     GetMem4 mpCode + 7, bCode(1)
    197.     GetMem2 &H33, bCode(5)
    198.  
    199.     lByteIdx = 7
    200.  
    201.     ' // SUB RSP, 0x28 + Args
    202.  
    203.     If UBound(vArgs) > 3 Then
    204.  
    205.         lArgs = UBound(vArgs) - 3
    206.          lArgs = (lArgs - (lArgs \ 2) * 2) + (lArgs \ 2) * 2
    207.    
    208.     End If
    209.  
    210.     lArgs = lArgs * &H10 + &H28
    211.  
    212.     GetMem4 &HEC8348, bCode(lByteIdx):  lByteIdx = lByteIdx + 3
    213.     GetMem1 lArgs, bCode(lByteIdx):     lByteIdx = lByteIdx + 1
    214.  
    215.     For Each vArg In vArgs
    216.    
    217.         Select Case VarType(vArg)
    218.         Case vbLong
    219.  
    220.             Select Case lIndex
    221.             Case 0: GetMem4 &HC1C748, bCode(lByteIdx):  lByteIdx = lByteIdx + 3
    222.             Case 1: GetMem4 &HC2C748, bCode(lByteIdx):  lByteIdx = lByteIdx + 3
    223.             Case 2: GetMem4 &HC0C749, bCode(lByteIdx):  lByteIdx = lByteIdx + 3
    224.             Case 3: GetMem4 &HC1C749, bCode(lByteIdx):  lByteIdx = lByteIdx + 3
    225.             Case Else
    226.        
    227.                 GetMem4 &H2444C748, bCode(lByteIdx):    lByteIdx = lByteIdx + 4
    228.                 GetMem1 (lIndex - 4) * 8 + &H20, bCode(lByteIdx):   lByteIdx = lByteIdx + 1
    229.  
    230.             End Select
    231.        
    232.             GetMem4 CLng(vArg), bCode(lByteIdx):    lByteIdx = lByteIdx + 4
    233.        
    234.         Case vbCurrency
    235.    
    236.             Select Case lIndex
    237.             Case 0: GetMem2 &HB948, bCode(lByteIdx):  lByteIdx = lByteIdx + 2
    238.             Case 1: GetMem2 &HBA48, bCode(lByteIdx):  lByteIdx = lByteIdx + 2
    239.             Case 2: GetMem2 &HB849, bCode(lByteIdx):  lByteIdx = lByteIdx + 2
    240.             Case 3: GetMem2 &HB949, bCode(lByteIdx):  lByteIdx = lByteIdx + 2
    241.             Case Else
    242.        
    243.                 GetMem2 &HB848, bCode(lByteIdx):      lByteIdx = lByteIdx + 2
    244.                 GetMem8 CCur(vArg), bCode(lByteIdx):  lByteIdx = lByteIdx + 8
    245.                 GetMem4 &H24448948, bCode(lByteIdx):  lByteIdx = lByteIdx + 4
    246.                 GetMem1 (lIndex - 4) * 8 + &H20, bCode(lByteIdx):   lByteIdx = lByteIdx + 1
    247.            
    248.             End Select
    249.        
    250.             If lIndex < 4 Then
    251.                 GetMem8 CCur(vArg), bCode(lByteIdx):  lByteIdx = lByteIdx + 8
    252.             End If
    253.        
    254.         End Select
    255.    
    256.         lIndex = lIndex + 1
    257.    
    258.     Next
    259.  
    260.     ' // MOV RAX, pfn: CALL RAX
    261.     GetMem2 &HB848, bCode(lByteIdx):    lByteIdx = lByteIdx + 2
    262.     GetMem8 pfn, bCode(lByteIdx):       lByteIdx = lByteIdx + 8
    263.     GetMem2 &HD0FF&, bCode(lByteIdx):   lByteIdx = lByteIdx + 2
    264.  
    265.     ' // ADD RSP, 0x28 + Args
    266.     GetMem4 &HC48348, bCode(lByteIdx):  lByteIdx = lByteIdx + 3
    267.     GetMem1 lArgs, bCode(lByteIdx):     lByteIdx = lByteIdx + 1
    268.  
    269.     ' // JMP FAR 23:ADDR
    270.     GetMem2 &H2DFF, bCode(lByteIdx):    lByteIdx = lByteIdx + 2
    271.     GetMem4 0&, bCode(lByteIdx):        lByteIdx = lByteIdx + 4
    272.     GetMem4 mpCode + lByteIdx + 6, bCode(lByteIdx):        lByteIdx = lByteIdx + 4
    273.     GetMem2 &H23&, bCode(lByteIdx):     lByteIdx = lByteIdx + 2
    274.  
    275.     bCode(lByteIdx) = &HC3
    276.  
    277.     Debug.Print Hex(VarPtr(bCode(0)))
    278.  
    279.     DispCallFunc ByVal 0&, mpCode, 4, vbLong, 0, ByVal 0&, ByVal 0&, vRet
    280.  
    281.     GetMem4 0&, Not Not bCode
    282.  
    283. End Function
    284.  
    285. ' // Get procedure arrdess from 64 bit dll
    286. Private Function GetProcAddress64( _
    287.                  ByRef pDllBase As LARGE_INTEGER, _
    288.                  ByRef sFunctionName As String) As LARGE_INTEGER
    289.     Dim pNtHeaders      As LARGE_INTEGER
    290.     Dim lRvaNtHeaders   As Long
    291.     Dim pExportTable    As LARGE_INTEGER
    292.     Dim tExpDir         As IMAGE_DATA_DIRECTORY
    293.     Dim tReturned       As LARGE_INTEGER
    294.     Dim pNames          As LARGE_INTEGER
    295.     Dim pName           As LARGE_INTEGER
    296.     Dim pOrdinals       As LARGE_INTEGER
    297.     Dim pAddresses      As LARGE_INTEGER
    298.     Dim lCount          As Long
    299.     Dim lIndex          As Long
    300.     Dim lOrdinal        As Long
    301.     Dim lBase           As Long
    302.  
    303.     pNtHeaders = x64PtrOffset(pDllBase.lowpart, pDllBase.highpart, &H3C)
    304.     NtWow64ReadVirtualMemory64 -1, pNtHeaders.lowpart, pNtHeaders.highpart, lRvaNtHeaders, 4, 0, tReturned
    305.  
    306.     pExportTable = x64PtrOffset(pDllBase.lowpart, pDllBase.highpart, lRvaNtHeaders + &H4 + &H14 + &H70)
    307.     NtWow64ReadVirtualMemory64 -1, pExportTable.lowpart, pExportTable.highpart, tExpDir, Len(tExpDir), 0, tReturned
    308.        
    309.     pExportTable = x64PtrOffset(pDllBase.lowpart, pDllBase.highpart, tExpDir.VirtualAddress)
    310.        
    311.     With x64PtrOffset(pExportTable.lowpart, pExportTable.highpart, &H18)
    312.         NtWow64ReadVirtualMemory64 -1, .lowpart, .highpart, lCount, Len(lCount), 0, tReturned
    313.     End With
    314.  
    315.     With x64PtrOffset(pExportTable.lowpart, pExportTable.highpart, &H10)
    316.         NtWow64ReadVirtualMemory64 -1, .lowpart, .highpart, lBase, Len(lBase), 0, tReturned
    317.     End With
    318.  
    319.     With x64PtrOffset(pExportTable.lowpart, pExportTable.highpart, &H20)
    320.         NtWow64ReadVirtualMemory64 -1, .lowpart, .highpart, pNames, 4, 0, tReturned
    321.     End With
    322.  
    323.     With x64PtrOffset(pExportTable.lowpart, pExportTable.highpart, &H24)
    324.         NtWow64ReadVirtualMemory64 -1, .lowpart, .highpart, pOrdinals, 4, 0, tReturned
    325.     End With
    326.  
    327.     With x64PtrOffset(pExportTable.lowpart, pExportTable.highpart, &H1C)
    328.         NtWow64ReadVirtualMemory64 -1, .lowpart, .highpart, pAddresses, 4, 0, tReturned
    329.     End With
    330.        
    331.     pNames = x64PtrOffset(pDllBase.lowpart, pDllBase.highpart, pNames.lowpart)
    332.     pOrdinals = x64PtrOffset(pDllBase.lowpart, pDllBase.highpart, pOrdinals.lowpart)
    333.     pAddresses = x64PtrOffset(pDllBase.lowpart, pDllBase.highpart, pAddresses.lowpart)
    334.  
    335.     For lIndex = 0 To lCount - 1
    336.    
    337.         NtWow64ReadVirtualMemory64 -1, pNames.lowpart, pNames.highpart, pName, 4, 0, tReturned
    338.         pName = x64PtrOffset(pDllBase.lowpart, pDllBase.highpart, pName.lowpart)
    339.    
    340.         If CompareAnsiString(pName, sFunctionName) = 0 Then
    341.  
    342.             pOrdinals = x64PtrOffset(pOrdinals.lowpart, pOrdinals.highpart, lIndex * 2)
    343.        
    344.             NtWow64ReadVirtualMemory64 -1, pOrdinals.lowpart, pOrdinals.highpart, lOrdinal, 2, 0, tReturned
    345.        
    346.             'lOrdinal = lOrdinal - lBase
    347.        
    348.             pAddresses = x64PtrOffset(pAddresses.lowpart, pAddresses.highpart, lOrdinal * 4)
    349.        
    350.             NtWow64ReadVirtualMemory64 -1, pAddresses.lowpart, pAddresses.highpart, GetProcAddress64, 4, 0, tReturned
    351.        
    352.             GetProcAddress64 = x64PtrOffset(pDllBase.lowpart, pDllBase.highpart, GetProcAddress64.lowpart)
    353.        
    354.             Exit Function
    355.        
    356.         End If
    357.    
    358.         pNames = x64PtrOffset(pNames.lowpart, pNames.highpart, 4)
    359.    
    360.     Next
    361.  
    362. End Function
    363.  
    364. ' // Get 64-bit ntdll base address
    365. Private Function GetNtDll_Handle() As LARGE_INTEGER
    366.     Dim pLdrData    As LARGE_INTEGER
    367.     Dim tReturned   As LARGE_INTEGER
    368.     Dim pList       As LARGE_INTEGER
    369.     Dim pDllName    As LARGE_INTEGER
    370.  
    371.     With x64PtrOffset(mtProcessInfo64.PebBaseAddress.lowpart, mtProcessInfo64.PebBaseAddress.highpart, &H18)
    372.         NtWow64ReadVirtualMemory64 -1, .lowpart, .highpart, pLdrData, 8, 0, tReturned
    373.     End With
    374.  
    375.     pLdrData = x64PtrOffset(pLdrData.lowpart, pLdrData.highpart, &H10)
    376.  
    377.     NtWow64ReadVirtualMemory64 -1, pLdrData.lowpart, pLdrData.highpart, pList, 8, 0, tReturned
    378.  
    379.     Do
    380.  
    381.         pDllName = x64PtrOffset(pList.lowpart, pList.highpart, &H58)
    382.  
    383.         If CompareUnicodeString64(pDllName, "ntdll.dll") = 0 Then
    384.        
    385.             With x64PtrOffset(pList.lowpart, pList.highpart, &H30)
    386.                 NtWow64ReadVirtualMemory64 -1, .lowpart, .highpart, GetNtDll_Handle, 8, 0, tReturned
    387.             End With
    388.        
    389.             Exit Function
    390.        
    391.         End If
    392.    
    393.         NtWow64ReadVirtualMemory64 -1, pList.lowpart, pList.highpart, pList, 8, 0, tReturned
    394.    
    395.     Loop Until (pList.lowpart = pLdrData.lowpart And pList.highpart = pLdrData.highpart)
    396.  
    397. End Function
    398.  
    399. Private Function CompareAnsiString( _
    400.                  ByRef pStr1 As LARGE_INTEGER, _
    401.                  ByRef sStr2 As String) As Long
    402.     Dim sString     As String
    403.     Dim bString()   As Byte
    404.     Dim tReturned   As LARGE_INTEGER
    405.  
    406.     ReDim bString(Len(sStr2))
    407.  
    408.     NtWow64ReadVirtualMemory64 -1, pStr1.lowpart, pStr1.highpart, bString(0), Len(sStr2) + 1, 0, tReturned
    409.  
    410.     If bString(Len(sStr2)) <> 0 Then
    411.  
    412.         CompareAnsiString = -1
    413.         Exit Function
    414.    
    415.     End If
    416.  
    417.     sString = Left$(StrConv(bString, vbUnicode), Len(sStr2))
    418.  
    419.     CompareAnsiString = StrComp(sString, sStr2, vbBinaryCompare)
    420.  
    421. End Function
    422.  
    423. Private Function CompareUnicodeString64( _
    424.                  ByRef pStr1 As LARGE_INTEGER, _
    425.                  ByRef sStr2 As String) As Long
    426.     Dim tString     As UNICODE_STRING64
    427.     Dim sString     As String
    428.     Dim tReturned   As LARGE_INTEGER
    429.  
    430.     NtWow64ReadVirtualMemory64 -1, pStr1.lowpart, pStr1.highpart, tString, Len(tString), 0, tReturned
    431.  
    432.     sString = Space$(tString.Length \ 2)
    433.  
    434.     NtWow64ReadVirtualMemory64 -1, tString.lpBuffer.lowpart, tString.lpBuffer.highpart, _
    435.                                     ByVal StrPtr(sString), tString.Length - 1, 0, tReturned
    436.  
    437.     Debug.Print sString
    438.  
    439.     CompareUnicodeString64 = StrComp(sString, sStr2, vbTextCompare)
    440.  
    441. End Function
    442.  
    443. Private Function x64PtrOffset( _
    444.                  ByVal pL As Long, _
    445.                  ByVal pH As Long, _
    446.                  ByVal lOffsetL As Long, _
    447.                  Optional ByVal lOffsetH As Long) As LARGE_INTEGER
    448.     Dim cValue  As Currency
    449.     Dim cOffset As Currency
    450.  
    451.     GetMem8 pL, cValue
    452.     GetMem8 lOffsetL, cOffset
    453.  
    454.     cValue = cValue + cOffset
    455.  
    456.     GetMem8 cValue, x64PtrOffset
    457.  
    458. End Function
    459.  
    460.  
    461. Private Sub Form_Unload(Cancel As Integer)
    462.     VirtualFree mpCode, 0, MEM_RELEASE
    463. End Sub
     
    Последнее редактирование модератором: 1 сен 2019
  10. trsoft

    trsoft Member

    Публикаций:
    0
    Регистрация:
    18 июл 2018
    Сообщения:
    112
    Странно, что меня тут не запинали ногами. Надо загрузить 64-битную длл в память 32-разрядного процесса средствами операционной системы, т.е. нужно сказать ОС использовать 64-разрядный загрузчик. Я не занимался этим вопросом, но с м. т зрения проще сделать из 32-битного приложения 64-битное, заменой pe-заголовка, например, и грузить после этого 64-разрядные длл. Имхо, Осн. проблема в многозадачности, в тебе, тибе, пебе процесса, контексте, где сохраняются 32-разрядные регистры. Инди мог бы лучше объяснить.
     
  11. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.381
    Thetrik,

    Я посмотрел этот код на вб, жесть :wacko:

    Что он делает не понятно, там сброс рабочего набора(maxws & minws = -1). Зачем это нужно ?

    Набор сбрасывается для дальнейших замеров, выборки или тайминга, этого в коде нет.
     
  12. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    3.381
    Rel,

    Причём там любил, это помесь нэйтива на вб с дикими конструкциями.
     
  13. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    540
    Это просто неполный пример, там еще куча кода есть который не вставлен

    Да ладно, к примеру на C подобный код будет выглядеть аналогично.
     
  14. M0rg0t

    M0rg0t Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    679
  15. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.149
    Такое ощущение, что топик не читал никто. Человек хотел в х32 приложении переключиться в х64 директивой use64. Вообще тема про ассемблер, что здесь делают все эти люди? :beee:
    ЗЫ: очень редко кого-то интересует что у кого и откуда течет при виде чего-то. Но некоторые считают своим долгом сообщить миру об этом.
     
    Последнее редактирование: 31 авг 2019