Поиск файла по известных системе путях (в x64 ОС) - VB
Формулировка задачи:
Привет всем!
Скажите, а через PathFindOnPath к 64-битным папкам никак не пробиться?
Придется свою функцию писать?
Вроде все правильно сделал (т.е. попробовал) ? :
Ой, извините, сглупил.
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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д