|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1991 Microsoft Corporation
4:
5: Module Name:
6:
7: imagedir.c
8:
9: Abstract:
10:
11: The module contains the code to translate an image directory type to
12: the address of the data for that entry.
13:
14: Author:
15:
16: Steve Wood 18-Aug-1989
17:
18: Environment:
19:
20: User Mode or Kernel Mode
21:
22: Revision History:
23:
24: --*/
25:
26: #include <windows.h>
27:
28:
29: // Helper routines
30:
31: PIMAGE_NT_HEADERS
32: ImageNtHeader (
33: IN PVOID Base
34: );
35:
36: PVOID
37: ImageDirectoryEntryToData (
38: IN PVOID Base,
39: IN BOOLEAN MappedAsImage,
40: IN USHORT DirectoryEntry,
41: OUT PULONG Size
42: );
43:
44: PIMAGE_NT_HEADERS
45: ImageNtHeader (
46: IN PVOID Base
47: )
48:
49: /*++
50:
51: Routine Description:
52:
53: This function returns the address of the NT Header.
54:
55: Arguments:
56:
57: Base - Supplies the base of the image.
58:
59: Return Value:
60:
61: Returns the address of the NT Header.
62:
63: --*/
64:
65: {
66:
67: PIMAGE_NT_HEADERS NtHeaders;
68:
69: if (Base != NULL &&
70: Base != (PVOID)-1
71: ) {
72: try {
73: if (((PIMAGE_DOS_HEADER)Base)->e_magic == IMAGE_DOS_SIGNATURE) {
74: NtHeaders = (PIMAGE_NT_HEADERS)((PCHAR)Base + ((PIMAGE_DOS_HEADER)Base)->e_lfanew);
75: if (NtHeaders->Signature == IMAGE_NT_SIGNATURE) {
76: return NtHeaders;
77: }
78: }
79:
80: } except(EXCEPTION_EXECUTE_HANDLER) {
81: return NULL;
82: }
83:
84: }
85:
86: return NULL;
87: }
88:
89:
90: PVOID
91: ImageDirectoryEntryToData (
92: IN PVOID Base,
93: IN BOOLEAN MappedAsImage,
94: IN USHORT DirectoryEntry,
95: OUT PULONG Size
96: )
97:
98: /*++
99:
100: Routine Description:
101:
102: This function locates a Directory Entry within the image header
103: and returns either the virtual address or seek address of the
104: data the Directory describes.
105:
106: Arguments:
107:
108: Base - Supplies the base of the image or data file.
109:
110: MappedAsImage - FALSE if the file is mapped as a data file.
111: - TRUE if the file is mapped as an image.
112:
113: DirectoryEntry - Supplies the directory entry to locate.
114:
115: Size - Return the size of the directory.
116:
117: Return Value:
118:
119: NULL - The file does not contain data for the specified directory entry.
120:
121: NON-NULL - Returns the address of the raw data the directory describes.
122:
123: --*/
124:
125: {
126: ULONG i, DirectoryAddress;
127: PIMAGE_NT_HEADERS NtHeaders;
128: PIMAGE_SECTION_HEADER NtSection;
129:
130: NtHeaders = ImageNtHeader(Base);
131:
132: if (DirectoryEntry >= NtHeaders->OptionalHeader.NumberOfRvaAndSizes) {
133: return( NULL );
134: }
135:
136: if (!(DirectoryAddress = NtHeaders->OptionalHeader.DataDirectory[ DirectoryEntry ].VirtualAddress)) {
137: return( NULL );
138: }
139: *Size = NtHeaders->OptionalHeader.DataDirectory[ DirectoryEntry ].Size;
140: if (MappedAsImage || DirectoryAddress < NtHeaders->OptionalHeader.SizeOfHeaders) {
141: return( (PVOID)((ULONG)Base + DirectoryAddress) );
142: }
143:
144: NtSection = (PIMAGE_SECTION_HEADER)((ULONG)NtHeaders +
145: sizeof(ULONG) +
146: sizeof(IMAGE_FILE_HEADER) +
147: NtHeaders->FileHeader.SizeOfOptionalHeader
148: );
149:
150: for (i=0; i<NtHeaders->FileHeader.NumberOfSections; i++) {
151: if (DirectoryAddress >= NtSection->VirtualAddress &&
152: DirectoryAddress < NtSection->VirtualAddress + NtSection->SizeOfRawData) {
153: return( (PVOID)((ULONG)Base + (DirectoryAddress - NtSection->VirtualAddress) + NtSection->PointerToRawData) );
154: }
155: ++NtSection;
156: }
157: return( NULL );
158: }
159:
160:
161: USHORT
162: ChkSum(
163: ULONG PartialSum,
164: PUSHORT Source,
165: ULONG Length
166: )
167:
168: /*++
169:
170: Routine Description:
171:
172: Compute a partial checksum on a portion of an imagefile.
173:
174: Arguments:
175:
176: PartialSum - Supplies the initial checksum value.
177:
178: Sources - Supplies a pointer to the array of words for which the
179: checksum is computed.
180:
181: Length - Supplies the length of the array in words.
182:
183: Return Value:
184:
185: The computed checksum value is returned as the function value.
186:
187: --*/
188:
189: {
190:
191: //
192: // Compute the word wise checksum allowing carries to occur into the
193: // high order half of the checksum longword.
194: //
195:
196: while (Length--) {
197: PartialSum += *Source++;
198: PartialSum = (PartialSum >> 16) + (PartialSum & 0xffff);
199: }
200:
201: //
202: // Fold final carry into a single word result and return the resultant
203: // value.
204: //
205:
206: return (USHORT)(((PartialSum >> 16) + PartialSum) & 0xffff);
207: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.