Поиск файла по известных системе путях (в x64 ОС) - VB
Формулировка задачи:
Привет всем!
Скажите, а через PathFindOnPath к 64-битным папкам никак не пробиться?
Придется свою функцию писать?
Вроде все правильно сделал (т.е. попробовал) ? :
Листинг программы
- Private Declare Function PathFindOnPath Lib "Shlwapi" Alias "PathFindOnPathW" (ByVal pszFile As Long, ppszOtherDirs As Any) As Long
- Private Declare Function Wow64DisableWow64FsRedirection Lib "kernel32" (OldValue As Long) As Long
- Private Declare Function Wow64RevertWow64FsRedirection Lib "kernel32" (ByVal OldValue As Long) As Long
- Private Const MAX_PATH As Long = 260
- Private Sub Command1_Click()
- Dim Drv As String
- Dim lPs As Long
- Dim lr As Long
- Dim lr2 As Long
- Dim OldValue As Long
- lr2 = Wow64DisableWow64FsRedirection(OldValue)
- Drv = Space(MAX_PATH)
- Mid(Drv, 1) = "ACPI.sys" & Chr(0) '"explorer.exe"
- lPs = StrPtr(Drv)
- lr = PathFindOnPath(lPs, 0)
- lr2 = Wow64RevertWow64FsRedirection(OldValue)
- stop
- 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
Листинг программы
- Option Explicit
- Private Declare Function NtQuerySystemInformation Lib "ntdll.dll" (ByVal infoClass As Long, Buffer As Any, ByVal BufferSize As Long, ret As Long) As Long
- Private Declare Sub memcpy Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
- Private Const DRIVER_INFORMATION As Long = 11
- Private Const SYSTEM_MODULE_SIZE As Long = 284
- Private Const STATUS_SUCCESS As Long = 0&
- Private Const STATUS_INFO_LENGTH_MISMATCH As Long = &HC0000004
- Private Type SYSTEM_MODULE
- Reserved1 As Long
- Reserved2 As Long
- ImageBaseAddress As Long
- ImageSize As Long
- Flags As Long
- Id As Integer
- Rank As Integer
- w018 As Integer
- NameOffset As Integer
- Name As String * 256
- End Type
- Private Type SYSTEM_MODULE_INFORMATION
- ModulesCount As Long
- Modules() As SYSTEM_MODULE
- End Type
- Private Sub Form_Load()
- Dim ret As Long
- Dim buf() As Byte
- Dim mdl As SYSTEM_MODULE_INFORMATION
- If NtQuerySystemInformation(DRIVER_INFORMATION, ByVal 0&, 0, ret) = STATUS_INFO_LENGTH_MISMATCH Then
- ReDim buf(ret - 1)
- If NtQuerySystemInformation(DRIVER_INFORMATION, buf(0), ret, ret) = STATUS_SUCCESS Then
- mdl.ModulesCount = buf(0) Or (buf(1) * &H100&) Or (buf(2) * &H10000) Or (buf(3) * &H1000000)
- If mdl.ModulesCount Then
- ReDim mdl.Modules(mdl.ModulesCount - 1)
- For ret = 0 To mdl.ModulesCount - 1
- memcpy mdl.Modules(ret), buf(ret * SYSTEM_MODULE_SIZE + 4), SYSTEM_MODULE_SIZE
- Print Left(mdl.Modules(ret).Name, InStr(1, mdl.Modules(ret).Name, vbNullChar) - 1)
- Next
- End If
- End If
- End If
- End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д