/*++

Copyright (c) 1997 Microsoft Corporation

Module Name:

    modimage.h

Abstract:

    Implements a set of routines for examining EXE modules

Author:

    Calin Negreanu (calinn) 27-Nov-1997

Revision History:

    calinn      08-Mar-2000 Moved over from Win9xUpg project.

--*/

#pragma once

//
// Includes
//

// None

//
// Debug constants
//

// None

//
// Strings
//

// None

//
// Constants
//

#define MODULETYPE_UNKNOWN      0x00000000
#define MODULETYPE_DOS          0x00000001
#define MODULETYPE_WIN16        0x00000002
#define MODULETYPE_WIN32        0x00000003

//
// Macros
//

// None

//
// Types
//

typedef struct _MD_IMPORT_ENUM16 {
    CHAR  ImportModule[MAX_MBCHAR_PATH];
    CHAR  ImportFunction[MAX_MBCHAR_PATH];
    ULONG ImportFunctionOrd;
    PVOID Handle;
} MD_IMPORT_ENUM16A, *PMD_IMPORT_ENUM16A;

typedef struct _MD_IMPORT_ENUM32 {
    PCSTR ImportModule;
    PCSTR ImportFunction;
    ULONG ImportFunctionOrd;
    PVOID Handle;
} MD_IMPORT_ENUM32A, *PMD_IMPORT_ENUM32A;

typedef struct _MD_MODULE_IMAGE {
    UINT ModuleType;
    union {
        struct {
            LOADED_IMAGE Image;
        } W32Data;
        struct {
            PBYTE Image;
            HANDLE FileHandle;
            HANDLE MapHandle;
        } W16Data;
    } ModuleData;
} MD_MODULE_IMAGE, *PMD_MODULE_IMAGE;

//
// Globals
//

// None

//
// Macro expansion list
//

// None

//
// Function prototypes
//

BOOL
MdLoadModuleDataA (
    IN      PCSTR ModuleName,
    OUT     PMD_MODULE_IMAGE ModuleImage
    );

BOOL
MdLoadModuleDataW (
    IN      PCWSTR ModuleName,
    OUT     PMD_MODULE_IMAGE ModuleImage
    );

BOOL
MdUnloadModuleDataA (
    IN OUT  PMD_MODULE_IMAGE ModuleImage
    );

BOOL
MdUnloadModuleDataW (
    IN OUT  PMD_MODULE_IMAGE ModuleImage
    );

BOOL
MdEnumFirstImport16A (
    IN      PBYTE ModuleImage,
    IN OUT  PMD_IMPORT_ENUM16A ImportsEnum
    );

BOOL
MdEnumNextImport16A (
    IN OUT  PMD_IMPORT_ENUM16A ImportsEnum
    );

BOOL
MdAbortImport16EnumA (
    IN      PMD_IMPORT_ENUM16A ImportsEnum
    );

BOOL
MdEnumFirstImportModule32A (
    IN      PLOADED_IMAGE ModuleImage,
    IN OUT  PMD_IMPORT_ENUM32A ImportsEnum
    );

BOOL
MdEnumNextImportModule32A (
    IN OUT  PMD_IMPORT_ENUM32A ImportsEnum
    );

BOOL
MdEnumFirstImportFunction32A (
    IN OUT  PMD_IMPORT_ENUM32A ImportsEnum
    );

BOOL
MdEnumNextImportFunction32A (
    IN OUT  PMD_IMPORT_ENUM32A ImportsEnum
    );

BOOL
MdAbortImport32EnumA (
    IN      PMD_IMPORT_ENUM32A ImportsEnum
    );

DWORD
MdGetModuleTypeA (
    IN      PCSTR ModuleName
    );

DWORD
MdGetModuleTypeW (
    IN      PCWSTR ModuleName
    );

PCSTR
MdGet16ModuleDescriptionA (
    IN      PCSTR ModuleName
    );

PCWSTR
MdGet16ModuleDescriptionW (
    IN      PCWSTR ModuleName
    );

ULONG
MdGetPECheckSumA (
    IN      PCSTR ModuleName
    );

DWORD
MdGetCheckSumA (
    IN      PCSTR ModuleName
    );

DWORD
MdGetCheckSumW (
    IN      PCWSTR ModuleName
    );

//
// New Executable resource access
//

HANDLE
NeOpenFileA (
    PCSTR FileName
    );

HANDLE
NeOpenFileW (
    PCWSTR FileName
    );

VOID
NeCloseFile (
    HANDLE Handle
    );

//
// Once upon a time ENUMRESTYPEPROC was defined as a TCHAR prototype,
// which was broken.  If ENUMRESTYPEPROCA isn't defined, we'll define
// it.  (NOTE: The current winbase.h has these typedefs.)
//

#ifndef ENUMRESTYPEPROCA

typedef BOOL (CALLBACK* ENUMRESTYPEPROCA)(HMODULE hModule, PSTR lpType, LONG_PTR lParam);

typedef BOOL (CALLBACK* ENUMRESTYPEPROCW)(HMODULE hModule, PWSTR lpType, LONG_PTR lParam);

typedef BOOL (CALLBACK* ENUMRESNAMEPROCA)(HMODULE hModule, PCSTR lpType, PSTR lpName, LONG_PTR lParam);

typedef BOOL (CALLBACK* ENUMRESNAMEPROCW)(HMODULE hModule, PCWSTR lpType, PWSTR lpName, LONG_PTR lParam);

#endif

BOOL
NeEnumResourceTypesA (
    IN      HANDLE Handle,
    IN      ENUMRESTYPEPROCA EnumFunc,
    IN      LONG_PTR lParam
    );

BOOL
NeEnumResourceTypesW (
    IN      HANDLE Handle,
    IN      ENUMRESTYPEPROCW EnumFunc,
    IN      LONG_PTR lParam
    );

BOOL
NeEnumResourceNamesA (
    IN      HANDLE Handle,
    IN      PCSTR Type,
    IN      ENUMRESNAMEPROCA EnumFunc,
    IN      LONG_PTR lParam
    );

BOOL
NeEnumResourceNamesW (
    IN      HANDLE Handle,
    IN      PCWSTR Type,
    IN      ENUMRESNAMEPROCW EnumFunc,
    IN      LONG_PTR lParam
    );

DWORD
NeSizeofResourceA (
    IN      HANDLE Handle,
    IN      PCSTR Type,
    IN      PCSTR Name
    );

DWORD
NeSizeofResourceW (
    IN      HANDLE Handle,
    IN      PCWSTR Type,
    IN      PCWSTR Name
    );

PBYTE
NeFindResourceExA (
    IN      HANDLE Handle,
    IN      PCSTR Type,
    IN      PCSTR Name
    );

PBYTE
NeFindResourceExW (
    IN      HANDLE Handle,
    IN      PCWSTR Type,
    IN      PCWSTR Name
    );

#define NeFindResourceA(h,n,t) NeFindResourceExA(h,t,n)
#define NeFindResourceW(h,n,t) NeFindResourceExW(h,t,n)

//
// Macro expansion definition
//

// None

//
// TCHAR mappings
//

#ifndef UNICODE

#define MD_IMPORT_ENUM16                    MD_IMPORT_ENUM16A
#define MD_IMPORT_ENUM32                    MD_IMPORT_ENUM32A
#define MdLoadModuleData                    MdLoadModuleDataA
#define MdUnloadModuleData                  MdUnloadModuleDataA
#define MdEnumFirstImport16                 MdEnumFirstImport16A
#define MdEnumNextImport16                  MdEnumNextImport16A
#define MdAbortImport16Enum                 MdAbortImport16EnumA
#define MdEnumFirstImportModule32           MdEnumFirstImportModule32A
#define MdEnumNextImportModule32            MdEnumNextImportModule32A
#define MdEnumFirstImportFunction32         MdEnumFirstImportFunction32A
#define MdEnumNextImportFunction32          MdEnumNextImportFunction32A
#define MdAbortImport32Enum                 MdAbortImport32EnumA
#define MdGetModuleType                     MdGetModuleTypeA
#define MdGet16ModuleDescription            MdGet16ModuleDescriptionA
#define MdGetPECheckSum                     MdGetPECheckSumA
#define MdGetCheckSum                       MdGetCheckSumA

#define NeOpenFile                          NeOpenFileA
#define NeEnumResourceTypes                 NeEnumResourceTypesA
#define NeEnumResourceNames                 NeEnumResourceNamesA
#define NeSizeofResource                    NeSizeofResourceA
#define NeFindResource                      NeFindResourceA
#define NeFindResourceEx                    NeFindResourceExA

#else

#define MD_IMPORT_ENUM16                    MD_IMPORT_ENUM16W
#define MD_IMPORT_ENUM32                    MD_IMPORT_ENUM32W
#define MdLoadModuleData                    MdLoadModuleDataW
#define MdUnloadModuleData                  MdUnloadModuleDataW
#define MdEnumFirstImport16                 MdEnumFirstImport16W
#define MdEnumNextImport16                  MdEnumNextImport16W
#define MdAbortImport16Enum                 MdAbortImport16EnumW
#define MdEnumFirstImportModule32           MdEnumFirstImportModule32W
#define MdEnumNextImportModule32            MdEnumNextImportModule32W
#define MdEnumFirstImportFunction32         MdEnumFirstImportFunction32W
#define MdEnumNextImportFunction32          MdEnumNextImportFunction32W
#define MdAbortImport32Enum                 MdAbortImport32EnumW
#define MdGetModuleType                     MdGetModuleTypeW
#define MdGet16ModuleDescription            MdGet16ModuleDescriptionW
#define MdGetPECheckSum                     MdGetPECheckSumW
#define MdGetCheckSum                       MdGetCheckSumW

#define NeOpenFile                          NeOpenFileW
#define NeEnumResourceTypes                 NeEnumResourceTypesW
#define NeEnumResourceNames                 NeEnumResourceNamesW
#define NeSizeofResource                    NeSizeofResourceW
#define NeFindResource                      NeFindResourceW
#define NeFindResourceEx                    NeFindResourceExW

#endif