Поиск файла по известных системе путях (в 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

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


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

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

6   голосов , оценка 3.833 из 5
Похожие ответы