254 lines
5.6 KiB
C
254 lines
5.6 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 2001 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
dmpobj.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This program reads the contents of a specific section from an OBJ
|
||
|
and emits its contents as a C-compatible UCHAR array.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Forrest Foltz (forrestf) 06-Mar-2001
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
ULONG FileSize;
|
||
|
|
||
|
VOID
|
||
|
Usage(VOID) {
|
||
|
|
||
|
fprintf(stderr,"\n"
|
||
|
"DMPOBJ reads the contents of a specific section from\n"
|
||
|
"an OBJ image and emits its contents as a c-compatible\n"
|
||
|
"UCHAR array.\n\n"
|
||
|
"Usage: DMPOBJ <source> <secnam> <varnam>\n"
|
||
|
"where: <source> is the full path of the .obj file\n\n"
|
||
|
" <secnam> is the name of the section to emit\n"
|
||
|
" Use ENTIRE_FILE to dump the whole thing\n\n"
|
||
|
" <varnam> is the name to assign to the array\n");
|
||
|
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
BOOLEAN
|
||
|
OpenFileImage(
|
||
|
IN PCHAR FilePath,
|
||
|
OUT HANDLE *FileHandle,
|
||
|
OUT PCHAR *FileImage
|
||
|
)
|
||
|
{
|
||
|
HANDLE fileHandle;
|
||
|
HANDLE mapHandle;
|
||
|
PVOID view;
|
||
|
|
||
|
fileHandle = CreateFile( FilePath,
|
||
|
GENERIC_READ,
|
||
|
0,
|
||
|
NULL,
|
||
|
OPEN_EXISTING,
|
||
|
FILE_ATTRIBUTE_NORMAL,
|
||
|
NULL );
|
||
|
if (fileHandle == INVALID_HANDLE_VALUE) {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
FileSize = GetFileSize( fileHandle, NULL );
|
||
|
|
||
|
|
||
|
mapHandle = CreateFileMapping( fileHandle,
|
||
|
NULL,
|
||
|
PAGE_READONLY,
|
||
|
0,
|
||
|
0,
|
||
|
NULL );
|
||
|
CloseHandle(fileHandle);
|
||
|
if (mapHandle == NULL) {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
view = MapViewOfFile( mapHandle,
|
||
|
FILE_MAP_READ,
|
||
|
0,
|
||
|
0,
|
||
|
0 );
|
||
|
|
||
|
if (view == NULL) {
|
||
|
CloseHandle(mapHandle);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
*FileHandle = mapHandle;
|
||
|
*FileImage = view;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
__cdecl
|
||
|
main (
|
||
|
int argc,
|
||
|
char *argv[]
|
||
|
)
|
||
|
{
|
||
|
HANDLE mapHandle;
|
||
|
PCHAR view;
|
||
|
BOOLEAN result;
|
||
|
|
||
|
PCHAR inputPath;
|
||
|
PCHAR sectionName;
|
||
|
PCHAR arrayName;
|
||
|
|
||
|
ULONG numberOfSections;
|
||
|
ULONG section;
|
||
|
|
||
|
PIMAGE_FILE_HEADER imageHeader;
|
||
|
PIMAGE_SECTION_HEADER sectionHeader;
|
||
|
PIMAGE_SECTION_HEADER indexHeader;
|
||
|
|
||
|
PUCHAR data;
|
||
|
PUCHAR dataEnd;
|
||
|
|
||
|
ULONG column;
|
||
|
|
||
|
BOOLEAN entireFile;
|
||
|
ULONG dumpSize;
|
||
|
|
||
|
if (argc != 4) {
|
||
|
Usage();
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get the user-supplied parameters and open the input image
|
||
|
//
|
||
|
|
||
|
inputPath = argv[1];
|
||
|
sectionName = argv[2];
|
||
|
arrayName = argv[3];
|
||
|
|
||
|
result = OpenFileImage( inputPath, &mapHandle, &view );
|
||
|
if (result == FALSE) {
|
||
|
fprintf(stderr, "DMPOBJ: could not open file %s for reading.\n");
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Find the desired section. It is is a fatal error to specify a
|
||
|
// section name that appears in more than one section.
|
||
|
//
|
||
|
|
||
|
if (strcmp("ENTIRE_FILE", sectionName) == 0) {
|
||
|
|
||
|
data = view;
|
||
|
dumpSize = FileSize;
|
||
|
|
||
|
} else {
|
||
|
|
||
|
imageHeader = (PIMAGE_FILE_HEADER)view;
|
||
|
numberOfSections = imageHeader->NumberOfSections;
|
||
|
|
||
|
indexHeader = (PIMAGE_SECTION_HEADER)((PUCHAR)(imageHeader + 1) +
|
||
|
imageHeader->SizeOfOptionalHeader);
|
||
|
|
||
|
sectionHeader = NULL;
|
||
|
for (section = 0; section < numberOfSections; section += 1) {
|
||
|
|
||
|
if (strncmp(indexHeader->Name,
|
||
|
sectionName,
|
||
|
IMAGE_SIZEOF_SHORT_NAME) == 0) {
|
||
|
|
||
|
if (sectionHeader != NULL) {
|
||
|
fprintf(stderr,
|
||
|
"DMPOBJ: multiple instances of section %s "
|
||
|
"found in image %s\n",
|
||
|
sectionName,
|
||
|
inputPath);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
sectionHeader = indexHeader;
|
||
|
}
|
||
|
|
||
|
indexHeader += 1;
|
||
|
}
|
||
|
|
||
|
if (sectionHeader == NULL) {
|
||
|
|
||
|
fprintf(stderr,
|
||
|
"DMPOBJ: could not find section %s in image %s\n",
|
||
|
sectionName,
|
||
|
inputPath);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
data = view + sectionHeader->PointerToRawData;
|
||
|
dumpSize = sectionHeader->SizeOfRawData;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Dump the contents of the section in a format compatible with a
|
||
|
// C language compiler.
|
||
|
//
|
||
|
|
||
|
fprintf(stdout, "//\n");
|
||
|
fprintf(stdout, "// DMPOBJ generated file, DO NOT EDIT\n");
|
||
|
fprintf(stdout, "//\n");
|
||
|
fprintf(stdout, "// Source: %s\n", inputPath);
|
||
|
fprintf(stdout, "// Section: %s\n", sectionName);
|
||
|
fprintf(stdout, "//\n");
|
||
|
fprintf(stdout, "\n");
|
||
|
|
||
|
fprintf(stdout, "const char %s[] = {\n ",arrayName);
|
||
|
|
||
|
column = 0;
|
||
|
|
||
|
dataEnd = data + dumpSize;
|
||
|
while (data < dataEnd) {
|
||
|
|
||
|
if (column == 12) {
|
||
|
fprintf(stdout, "\n ");
|
||
|
column = 0;
|
||
|
}
|
||
|
|
||
|
fprintf(stdout, "0x%02x", *data);
|
||
|
|
||
|
if (data < (dataEnd - 1)) {
|
||
|
fprintf(stdout, ", ");
|
||
|
}
|
||
|
|
||
|
column += 1;
|
||
|
data += 1;
|
||
|
}
|
||
|
|
||
|
fprintf(stdout, "\n};\n\n");
|
||
|
|
||
|
fprintf(stdout,
|
||
|
"#define %sSize 0x%0x\n\n",
|
||
|
arrayName,
|
||
|
dumpSize);
|
||
|
|
||
|
CloseHandle(mapHandle);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|