Поиск файла по известных системе путях (в x64 ОС) - VB

Узнай цену своей работы

Формулировка задачи:

Привет всем! Скажите, а через PathFindOnPath к 64-битным папкам никак не пробиться? Придется свою функцию писать? Вроде все правильно сделал (т.е. попробовал) ? :
Листинг программы
  1. Private Declare Function PathFindOnPath Lib "Shlwapi" Alias "PathFindOnPathW" (ByVal pszFile As Long, ppszOtherDirs As Any) As Long
  2. Private Declare Function Wow64DisableWow64FsRedirection Lib "kernel32" (OldValue As Long) As Long
  3. Private Declare Function Wow64RevertWow64FsRedirection Lib "kernel32" (ByVal OldValue As Long) As Long
  4. Private Const MAX_PATH As Long = 260
  5. Private Sub Command1_Click()
  6. Dim Drv As String
  7. Dim lPs As Long
  8. Dim lr As Long
  9. Dim lr2 As Long
  10. Dim OldValue As Long
  11. lr2 = Wow64DisableWow64FsRedirection(OldValue)
  12. Drv = Space(MAX_PATH)
  13. Mid(Drv, 1) = "ACPI.sys" & Chr(0) '"explorer.exe"
  14. lPs = StrPtr(Drv)
  15. lr = PathFindOnPath(lPs, 0)
  16. lr2 = Wow64RevertWow64FsRedirection(OldValue)
  17. stop
  18. end sub
Ой, извините, сглупил. Drivers - не является известной системе папкой. Все работает. Тема решена.
Странно, почему тогда NtQuerySystemInformation с флагом DRIVER_INFORMATION выдает этот файл без указания абсолютного пути.
А как правильно создать такой массив?
Type: LPCTSTR* An optional, null-terminated array of directories to be searched first. This value can be NULL.

Решение задачи: «Поиск файла по известных системе путях (в x64 ОС)»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. Private Declare Function NtQuerySystemInformation Lib "ntdll.dll" (ByVal infoClass As Long, Buffer As Any, ByVal BufferSize As Long, ret As Long) As Long
  4. Private Declare Sub memcpy Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  5.  
  6. Private Const DRIVER_INFORMATION            As Long = 11
  7. Private Const SYSTEM_MODULE_SIZE            As Long = 284
  8. Private Const STATUS_SUCCESS                As Long = 0&
  9. Private Const STATUS_INFO_LENGTH_MISMATCH   As Long = &HC0000004
  10.  
  11. Private Type SYSTEM_MODULE
  12.     Reserved1           As Long
  13.     Reserved2           As Long
  14.     ImageBaseAddress    As Long
  15.     ImageSize           As Long
  16.     Flags               As Long
  17.     Id                  As Integer
  18.     Rank                As Integer
  19.     w018                As Integer
  20.     NameOffset          As Integer
  21.     Name                As String * 256
  22. End Type
  23.  
  24. Private Type SYSTEM_MODULE_INFORMATION
  25.     ModulesCount        As Long
  26.     Modules()           As SYSTEM_MODULE
  27. End Type
  28.  
  29.  
  30. Private Sub Form_Load()
  31.     Dim ret     As Long
  32.     Dim buf()   As Byte
  33.     Dim mdl     As SYSTEM_MODULE_INFORMATION
  34.    
  35.     If NtQuerySystemInformation(DRIVER_INFORMATION, ByVal 0&, 0, ret) = STATUS_INFO_LENGTH_MISMATCH Then
  36.    
  37.         ReDim buf(ret - 1)
  38.        
  39.         If NtQuerySystemInformation(DRIVER_INFORMATION, buf(0), ret, ret) = STATUS_SUCCESS Then
  40.        
  41.             mdl.ModulesCount = buf(0) Or (buf(1) * &H100&) Or (buf(2) * &H10000) Or (buf(3) * &H1000000)
  42.            
  43.             If mdl.ModulesCount Then
  44.            
  45.                 ReDim mdl.Modules(mdl.ModulesCount - 1)
  46.                  
  47.                 For ret = 0 To mdl.ModulesCount - 1
  48.                    
  49.                     memcpy mdl.Modules(ret), buf(ret * SYSTEM_MODULE_SIZE + 4), SYSTEM_MODULE_SIZE
  50.                    
  51.                     Print Left(mdl.Modules(ret).Name, InStr(1, mdl.Modules(ret).Name, vbNullChar) - 1)
  52.                    
  53.                 Next
  54.                
  55.             End If
  56.            
  57.         End If
  58.        
  59.     End If
  60.    
  61. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы