⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kmdresource.cpp

📁 Programming the Microsoft Windows driver model.2nd 随书光盘。内有很多作者送的实用工具和随书源码。WDM编程
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// CEF relocation types.

//



#define IMAGE_REL_CEF_ABSOLUTE          0x0000  // Reference is absolute, no relocation is necessary

#define IMAGE_REL_CEF_ADDR32            0x0001  // 32-bit address (VA).

#define IMAGE_REL_CEF_ADDR64            0x0002  // 64-bit address (VA).

#define IMAGE_REL_CEF_ADDR32NB          0x0003  // 32-bit address w/o image base (RVA).

#define IMAGE_REL_CEF_SECTION           0x0004  // Section index

#define IMAGE_REL_CEF_SECREL            0x0005  // 32 bit offset from base of section containing target

#define IMAGE_REL_CEF_TOKEN             0x0006  // 32 bit metadata token



// Please contact INTEL to get IA64-specific information



//

// Line number format.

//



typedef struct _IMAGE_LINENUMBER {

    union {

        DWORD   SymbolTableIndex;               // Symbol table index of function name if Linenumber is 0.

        DWORD   VirtualAddress;                 // Virtual address of line number.

    } Type;

    WORD    Linenumber;                         // Line number.

} IMAGE_LINENUMBER;

typedef IMAGE_LINENUMBER UNALIGNED *PIMAGE_LINENUMBER;



#define IMAGE_SIZEOF_LINENUMBER              6



#ifndef _MAC

#include "poppack.h"                        // Back to 4 byte packing

#endif



//

// Based relocation format.

//



typedef struct _IMAGE_BASE_RELOCATION {

    DWORD   VirtualAddress;

    DWORD   SizeOfBlock;

//  WORD    TypeOffset[1];

} IMAGE_BASE_RELOCATION;

typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;



#define IMAGE_SIZEOF_BASE_RELOCATION         8



//

// Based relocation types.

//



#define IMAGE_REL_BASED_ABSOLUTE              0

#define IMAGE_REL_BASED_HIGH                  1

#define IMAGE_REL_BASED_LOW                   2

#define IMAGE_REL_BASED_HIGHLOW               3

#define IMAGE_REL_BASED_HIGHADJ               4

#define IMAGE_REL_BASED_MIPS_JMPADDR          5

#define IMAGE_REL_BASED_SECTION               6

#define IMAGE_REL_BASED_REL32                 7



#define IMAGE_REL_BASED_MIPS_JMPADDR16        9

#define IMAGE_REL_BASED_IA64_IMM64            9

#define IMAGE_REL_BASED_DIR64                 10

#define IMAGE_REL_BASED_HIGH3ADJ              11





//

// Archive format.

//



#define IMAGE_ARCHIVE_START_SIZE             8

#define IMAGE_ARCHIVE_START                  "!<arch>\n"

#define IMAGE_ARCHIVE_END                    "`\n"

#define IMAGE_ARCHIVE_PAD                    "\n"

#define IMAGE_ARCHIVE_LINKER_MEMBER          "/               "

#define IMAGE_ARCHIVE_LONGNAMES_MEMBER       "//              "



typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {

    BYTE     Name[16];                          // File member name - `/' terminated.

    BYTE     Date[12];                          // File member date - decimal.

    BYTE     UserID[6];                         // File member user id - decimal.

    BYTE     GroupID[6];                        // File member group id - decimal.

    BYTE     Mode[8];                           // File member mode - octal.

    BYTE     Size[10];                          // File member size - decimal.

    BYTE     EndHeader[2];                      // String to end header.

} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;



#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR      60



//

// DLL support.

//



//

// Export Format

//



typedef struct _IMAGE_EXPORT_DIRECTORY {

    DWORD   Characteristics;

    DWORD   TimeDateStamp;

    WORD    MajorVersion;

    WORD    MinorVersion;

    DWORD   Name;

    DWORD   Base;

    DWORD   NumberOfFunctions;

    DWORD   NumberOfNames;

    DWORD   AddressOfFunctions;     // RVA from base of image

    DWORD   AddressOfNames;         // RVA from base of image

    DWORD   AddressOfNameOrdinals;  // RVA from base of image

} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;



//

// Import Format

//



typedef struct _IMAGE_IMPORT_BY_NAME {

    WORD    Hint;

    BYTE    Name[1];

} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;



#include "pshpack8.h"                       // Use align 8 for the 64-bit IAT.



typedef struct _IMAGE_THUNK_DATA64 {

    union {

        ULONGLONG ForwarderString;  // PBYTE 

        ULONGLONG Function;         // PDWORD

        ULONGLONG Ordinal;

        ULONGLONG AddressOfData;    // PIMAGE_IMPORT_BY_NAME

    } u1;

} IMAGE_THUNK_DATA64;

typedef IMAGE_THUNK_DATA64 * PIMAGE_THUNK_DATA64;



#include "poppack.h"                        // Back to 4 byte packing



typedef struct _IMAGE_THUNK_DATA32 {

    union {

        DWORD ForwarderString;      // PBYTE 

        DWORD Function;             // PDWORD

        DWORD Ordinal;

        DWORD AddressOfData;        // PIMAGE_IMPORT_BY_NAME

    } u1;

} IMAGE_THUNK_DATA32;

typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;



#define IMAGE_ORDINAL_FLAG64 0x8000000000000000

#define IMAGE_ORDINAL_FLAG32 0x80000000

#define IMAGE_ORDINAL64(Ordinal) (Ordinal & 0xffff)

#define IMAGE_ORDINAL32(Ordinal) (Ordinal & 0xffff)

#define IMAGE_SNAP_BY_ORDINAL64(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG64) != 0)

#define IMAGE_SNAP_BY_ORDINAL32(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG32) != 0)



//

// Thread Local Storage

//



typedef VOID

(NTAPI *PIMAGE_TLS_CALLBACK) (

    PVOID DllHandle,

    DWORD Reason,

    PVOID Reserved

    );



typedef struct _IMAGE_TLS_DIRECTORY64 {

    ULONGLONG   StartAddressOfRawData;

    ULONGLONG   EndAddressOfRawData;

    ULONGLONG   AddressOfIndex;         // PDWORD

    ULONGLONG   AddressOfCallBacks;     // PIMAGE_TLS_CALLBACK *;

    DWORD   SizeOfZeroFill;

    DWORD   Characteristics;

} IMAGE_TLS_DIRECTORY64;

typedef IMAGE_TLS_DIRECTORY64 * PIMAGE_TLS_DIRECTORY64;



typedef struct _IMAGE_TLS_DIRECTORY32 {

    DWORD   StartAddressOfRawData;

    DWORD   EndAddressOfRawData;

    DWORD   AddressOfIndex;             // PDWORD

    DWORD   AddressOfCallBacks;         // PIMAGE_TLS_CALLBACK *

    DWORD   SizeOfZeroFill;

    DWORD   Characteristics;

} IMAGE_TLS_DIRECTORY32;

typedef IMAGE_TLS_DIRECTORY32 * PIMAGE_TLS_DIRECTORY32;



#ifdef _WIN64

#define IMAGE_ORDINAL_FLAG              IMAGE_ORDINAL_FLAG64

#define IMAGE_ORDINAL(Ordinal)          IMAGE_ORDINAL64(Ordinal)

typedef IMAGE_THUNK_DATA64              IMAGE_THUNK_DATA;

typedef PIMAGE_THUNK_DATA64             PIMAGE_THUNK_DATA;

#define IMAGE_SNAP_BY_ORDINAL(Ordinal)  IMAGE_SNAP_BY_ORDINAL64(Ordinal)

typedef IMAGE_TLS_DIRECTORY64           IMAGE_TLS_DIRECTORY;

typedef PIMAGE_TLS_DIRECTORY64          PIMAGE_TLS_DIRECTORY;

#else

#define IMAGE_ORDINAL_FLAG              IMAGE_ORDINAL_FLAG32

#define IMAGE_ORDINAL(Ordinal)          IMAGE_ORDINAL32(Ordinal)

typedef IMAGE_THUNK_DATA32              IMAGE_THUNK_DATA;

typedef PIMAGE_THUNK_DATA32             PIMAGE_THUNK_DATA;

#define IMAGE_SNAP_BY_ORDINAL(Ordinal)  IMAGE_SNAP_BY_ORDINAL32(Ordinal)

typedef IMAGE_TLS_DIRECTORY32           IMAGE_TLS_DIRECTORY;

typedef PIMAGE_TLS_DIRECTORY32          PIMAGE_TLS_DIRECTORY;

#endif



typedef struct _IMAGE_IMPORT_DESCRIPTOR {

    union {

        DWORD   Characteristics;            // 0 for terminating null import descriptor

        DWORD   OriginalFirstThunk;         // RVA to original unbound IAT (PIMAGE_THUNK_DATA)

    };

    DWORD   TimeDateStamp;                  // 0 if not bound,

                                            // -1 if bound, and real date\time stamp

                                            //     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)

                                            // O.W. date/time stamp of DLL bound to (Old BIND)



    DWORD   ForwarderChain;                 // -1 if no forwarders

    DWORD   Name;

    DWORD   FirstThunk;                     // RVA to IAT (if bound this IAT has actual addresses)

} IMAGE_IMPORT_DESCRIPTOR;

typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;



//

// New format import descriptors pointed to by DataDirectory[ IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT ]

//



typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {

    DWORD   TimeDateStamp;

    WORD    OffsetModuleName;

    WORD    NumberOfModuleForwarderRefs;

// Array of zero or more IMAGE_BOUND_FORWARDER_REF follows

} IMAGE_BOUND_IMPORT_DESCRIPTOR,  *PIMAGE_BOUND_IMPORT_DESCRIPTOR;



typedef struct _IMAGE_BOUND_FORWARDER_REF {

    DWORD   TimeDateStamp;

    WORD    OffsetModuleName;

    WORD    Reserved;

} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;



//

// Resource Format.

//



//

// Resource directory consists of two counts, following by a variable length

// array of directory entries.  The first count is the number of entries at

// beginning of the array that have actual names associated with each entry.

// The entries are in ascending order, case insensitive strings.  The second

// count is the number of entries that immediately follow the named entries.

// This second count identifies the number of entries that have 16-bit integer

// Ids as their name.  These entries are also sorted in ascending order.

//

// This structure allows fast lookup by either name or number, but for any

// given resource entry only one form of lookup is supported, not both.

// This is consistant with the syntax of the .RC file and the .RES file.

//



typedef struct _IMAGE_RESOURCE_DIRECTORY {

    DWORD   Characteristics;

    DWORD   TimeDateStamp;

    WORD    MajorVersion;

    WORD    MinorVersion;

    WORD    NumberOfNamedEntries;

    WORD    NumberOfIdEntries;

//  IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];

} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;



#define IMAGE_RESOURCE_NAME_IS_STRING        0x80000000

#define IMAGE_RESOURCE_DATA_IS_DIRECTORY     0x80000000

//

// Each directory contains the 32-bit Name of the entry and an offset,

// relative to the beginning of the resource directory of the data associated

// with this directory entry.  If the name of the entry is an actual text

// string instead of an integer Id, then the high order bit of the name field

// is set to one and the low order 31-bits are an offset, relative to the

// beginning of the resource directory of the string, which is of type

// IMAGE_RESOURCE_DIRECTORY_STRING.  Otherwise the high bit is clear and the

// low-order 16-bits are the integer Id that identify this resource directory

// entry. If the directory entry is yet another resource directory (i.e. a

// subdirectory), then the high order bit of the offset field will be

// set to indicate this.  Otherwise the high bit is clear and the offset

// field points to a resource data entry.

//



typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {

    union {

        struct {

            DWORD NameOffset:31;

            DWORD NameIsString:1;

        };

        DWORD   Name;

        WORD    Id;

    };

    union {

        DWORD   OffsetToData;

        struct {

            DWORD   OffsetToDirectory:31;

            DWORD   DataIsDirectory:1;

        };

    };

} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;



//

// For resource directory entries that have actual string names, the Name

// field of the directory entry points to an object of the following type.

// All of these string objects are stored together after the last resource

// directory entry and before the first resource data object.  This minimizes

// the impact of these variable length objects on the alignment of the fixed

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -