| 253 | #pragma region Internals |
| 254 | |
| 255 | PE_STATUS peParseBuffer( PE *pe ) |
| 256 | { |
| 257 | #define PE_SAFE_CAST( WHAT, TYPE, POS ) \ |
| 258 | if( POS < pe->dwFileSize && pe->dwFileSize - POS >= sizeof(TYPE) ) \ |
| 259 | { \ |
| 260 | WHAT = (P##TYPE)(pe->pData + (POS)); \ |
| 261 | } \ |
| 262 | else \ |
| 263 | { \ |
| 264 | return PE_UNEXPECTED_EOF; \ |
| 265 | } \ |
| 266 | |
| 267 | PE_SAFE_CAST( pe->Headers.DOS, IMAGE_DOS_HEADER, 0 ); |
| 268 | if( pe->Headers.DOS->e_magic != IMAGE_DOS_SIGNATURE ) |
| 269 | { |
| 270 | return PE_NOT_PE; |
| 271 | } |
| 272 | |
| 273 | PE_SAFE_CAST( pe->Headers.NT, IMAGE_NT_HEADERS, (ULONG)pe->Headers.DOS->e_lfanew ); |
| 274 | if( pe->Headers.NT->Signature != IMAGE_NT_SIGNATURE ) |
| 275 | { |
| 276 | return PE_NOT_PE; |
| 277 | } |
| 278 | |
| 279 | if( pe->Headers.NT->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC ) |
| 280 | { |
| 281 | pe->Headers.Plus = FALSE; |
| 282 | pe->Headers.OPT.p32 = &((PIMAGE_NT_HEADERS32)pe->Headers.NT)->OptionalHeader; |
| 283 | pe->qwBaseAddress = pe->Headers.OPT.p32->ImageBase; |
| 284 | pe->dwImageSize = pe->Headers.OPT.p32->SizeOfImage; |
| 285 | |
| 286 | pe->Sections.pHeaders = PE_IMAGE_FIRST_SECTION32( pe->Headers.NT ); |
| 287 | } |
| 288 | else if( pe->Headers.NT->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC ) |
| 289 | { |
| 290 | pe->Headers.Plus = TRUE; |
| 291 | pe->Headers.OPT.p64 = &((PIMAGE_NT_HEADERS64)pe->Headers.NT)->OptionalHeader; |
| 292 | pe->qwBaseAddress = pe->Headers.OPT.p64->ImageBase; |
| 293 | pe->dwImageSize = pe->Headers.OPT.p64->SizeOfImage; |
| 294 | |
| 295 | pe->Sections.pHeaders = PE_IMAGE_FIRST_SECTION64( pe->Headers.NT ); |
| 296 | } |
| 297 | else |
| 298 | { |
| 299 | return PE_NOT_PE; |
| 300 | } |
| 301 | |
| 302 | pe->Sections.dwNumber = pe->Headers.NT->FileHeader.NumberOfSections; |
| 303 | |
| 304 | PE_SET_PARSED( pe, SECTIONS ); |
| 305 | |
| 306 | PE_ADDRESS_FROM_VA |
| 307 | ( |
| 308 | pe, |
| 309 | pe->EntryPoint, |
| 310 | pe->qwBaseAddress + PE_HEADERS_OPT_FIELD( pe, AddressOfEntryPoint ) |
| 311 | ); |
| 312 |
no outgoing calls
no test coverage detected