//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Confidential Trade Secret.
// Copyright 1987-2001 Data Access Corporation, Miami FL, USA
// All Rights reserved
// DataFlex is a registered trademark of Data Access Corporation.
//
// Module:
//      EnumProcessModules.Pkg
//
// Purpose:
//      Defines interface to WinAPI function EnumProcessModules.
//
// Author:
//      Ulbe Stellema, Vincent Oorsprong
//
// Date:
//      2002, June, 29th
//
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Use GetCurrentProcessId.Pkg
Use OpenProcess.Pkg
Use CloseHandle.Pkg

#IFNDEF U_cProcessModulesArray
External_Function WinAPI_EnumProcessModules "EnumProcessModules" Psapi.Dll Handle hProcess Pointer lphModule Integer cb Pointer lpcbNeeded Returns Integer

//****************************************************************************
// $Module type: CLASS
// $Module name: cProcessModulesArray
// $Author     : VO
// Created     : 06/29/02 @ 10:58
//
// Description
//      Create an object of this class to enumerate the process modules and
//      retrieve the names from the array
//
// $Rev History
//      06/29/02 VO Module header created
//****************************************************************************
Class cProcessModulesArray is An Array
    //****************************************************************************
    // $Module type: PROCEDURE
    // $Module name: DoEnumProcessModules
    // $Author     : VO
    // Created     : 06/29/02 @ 10:59
    //
    // Description
    //      This is the public message to run the enumeration
    //
    // $Rev History
    //      06/29/02 VO Module header created
    //****************************************************************************
    Procedure DoEnumProcessModules
        Handle hProcess hModule
        DWord dwProcessId
        String sArrayOfProcessIds sModuleHandle sModuleName
        Integer iSizeOfProcessIdsArray iVoid iModule iModules 
        Integer iOldDelegationMode iModuleFileNameLength
        Boolean bOk
    
        // Remove all previous enumerated process modules if they exist
        Send Delete_Data
    
        Get Delegation_Mode to iOldDelegationMode
        Set Delegation_Mode to Delegate_To_Parent
    
        Get VO_GetCurrentProcessId to dwProcessId
        If (dwProcessId <> 0) Begin
            Get OpenProcess (PROCESS_VM_READ + PROCESS_QUERY_INFORMATION) dwProcessId to hProcess
            If (hProcess <> 0) Begin
                Move 0 to iSizeOfProcessIdsArray
                ZeroString 1 to sArrayOfProcessIds
                Move (WinAPI_EnumProcessModules (hProcess, AddressOf (sArrayOfProcessIds), 0, AddressOf (iSizeOfProcessIdsArray))) to bOk
                If (not (bOk)) Begin
                    Get ShowLastError to iVoid
                End
                Else Begin
                    ZeroString iSizeOfProcessIdsArray to sArrayOfProcessIds
                    Move (WinAPI_EnumProcessModules (hProcess, AddressOf (sArrayOfProcessIds), iSizeOfProcessIdsArray, AddressOf (iSizeOfProcessIdsArray))) to bOk
                    If (not (bOk)) Begin
                        Get ShowLastError to iVoid
                    End
                    Else Begin
                        Move (iSizeOfProcessIdsArray / 4) to iModules
                        For iModule From 1 to iModules
                            Move (Mid (sArrayOfProcessIds, 4, (((iModule - 1) * 4) + 1))) to sModuleHandle
                            Get BytesToDWord sModuleHandle 1 to hModule
                            ZeroString 255 to sModuleName
                            Move (GetModuleFileName (hModule, AddressOf (sModuleName), 255)) to iModuleFileNameLength
                            If (iModuleFileNameLength = 0) Begin
                                Get ShowLastError to iVoid
                            End
                            Else Begin
                                Move (CString (sModuleName)) to sModuleName
                                Set Array_Value Item (Item_Count (Self)) to sModuleName
                            End
                        Loop
                    End
                End
                Get CloseHandle hProcess to bOk
            End
        End
    
        Set Delegation_Mode to iOldDelegationMode
    End_Procedure // DoEnumProcessModules
End_Class // cProcessModulesArray
#ENDIF