Added PE loader to LOADROS. Updated symbol search in Loader

svn path=/trunk/; revision=533
This commit is contained in:
Rex Jolliff 1999-06-04 23:59:35 +00:00
parent c4ba9a330d
commit 9083091f7b
8 changed files with 720 additions and 223 deletions

View file

@ -5,6 +5,8 @@
#include <winddi.h>
#include "vgaddi.h"
VOID VGADDIAssertMode(IN DHPDEV DPev,
IN BOOL Enable);
VOID VGADDICompletePDEV(IN DHPDEV PDev,
@ -90,7 +92,9 @@ DrvEnableDriver(IN ULONG EngineVersion,
{
DriveEnableData->pdrvfn = FuncList;
DriveEnableData->c = sizeof FuncList / sizeof &FuncList[0];
DriveEnableData->iDriverVersion = DDI_DRIVER_VERSION;
return TRUE;
}
// DrvDisableDriver
@ -103,16 +107,32 @@ DrvEnableDriver(IN ULONG EngineVersion,
VOID DrvDisableDriver(VOID)
{
return;
}
// ----------------------------------------------- Driver Implementation
VOID VGADDIAssertMode(IN DHPDEV DPev,
IN BOOL Enable);
VOID VGADDICompletePDEV(IN DHPDEV PDev,
IN HDEV Dev);
VOID VGADDIDisablePDEV(IN DHPDEV PDev);
VOID VGADDIDisableSurface(IN DHPDEV PDev);
// DrvEnablePDEV
// DESCRIPTION:
// This function is called after DrvEnableDriver to get information
// about the mode that is to be used. This function just returns
// information, and should not yet initialize the mode.
// ARGUMENTS:
// IN DEVMODEW * DM Describes the mode requested
// IN LPWSTR LogAddress
// IN ULONG PatternCount number of patterns expected
// OUT HSURF * SurfPatterns array to contain pattern handles
// IN ULONG CapsSize the size of the DevCaps object passed in
// OUT ULONG * DevCaps Device Capabilities object
// IN ULONG DevInfoSize the size of the DevInfo object passed in
// OUT DEVINFO * DI Device Info object
// IN LPWSTR DevDataFile ignore
// IN LPWSTR DeviceName Device name
// IN HANDLE Driver handle to KM driver
// RETURNS:
// DHPDEV a handle to a DPev object
DHPDEV VGADDIEnablePDEV(IN DEVMODEW *DM,
IN LPWSTR LogAddress,
IN ULONG PatternCount,
@ -123,9 +143,45 @@ DHPDEV VGADDIEnablePDEV(IN DEVMODEW *DM,
OUT DEVINFO *DI,
IN LPWSTR DevDataFile,
IN LPWSTR DeviceName,
IN HANDLE Driver);
IN HANDLE Driver)
{
PPDEV PDev;
PDev = EngAllocMem(FL_ZERO_MEMORY, sizeof(PDEV), ALLOC_TAG);
if (PDev == NULL)
{
EngDebugPrint(1, "EngAllocMem failed for PDEV\n");
return NULL;
}
PDev->KMDriver = Driver;
/* FIXME: fill out DevCaps */
/* FIXME: full out DevInfo */
return PDev;
}
// DrvEnablePDEV
// DESCRIPTION
// Called after initialization of PDEV is complete. Supplies
// a reference to the GDI handle for the PDEV.
VOID VGADDICompletePDEV(IN DHPDEV PDev,
IN HDEV Dev)
{
((PPDEV) PDev)->GDIDevHandle = Dev;
}
VOID VGADDIAssertMode(IN DHPDEV DPev,
IN BOOL Enable);
VOID VGADDIDisablePDEV(IN DHPDEV PDev);
VOID VGADDIDisableSurface(IN DHPDEV PDev);
HSURF VGADDIEnableSurface(IN DHPDEV PDev);
ULONG VGADDIGetModes(IN HANDLE Driver,
IN ULONG DataSize,
OUT PDEVMODEW DM);

View file

@ -31,6 +31,26 @@ org 100h
;
BITS 16
%define NDEBUG 1
%macro DPRINT 1+
%ifndef NDEBUG
jmp %%end_str
%%str: db %1
%%end_str:
push di
push ds
push es
pop ds
mov di, %%str
call print_string
pop ds
pop di
%endif
%endmacro
entry:
;
; Load stack
@ -38,6 +58,8 @@ entry:
cli
push ds
pop ss
push ds
pop es
mov sp,real_stack_end
sti
@ -126,9 +148,9 @@ l14:
; Process the arguments
;
mov di,loading_msg
call _print_string
call print_string
mov di,dx
call _print_string
call print_string
mov ah,02h
mov dl,0dh
int 021h
@ -141,7 +163,8 @@ l14:
;
push di
mov dx,di
call _load_file
; call _load_file
call pe_load_module
pop di
;
@ -180,147 +203,11 @@ exit:
;
_error:
mov di,err_msg
call _print_string
call print_string
jmp exit
end_cmd_line dw 0
;
; Read in a file to kernel_base, set kernel base to the end of the file in
; memory rounded up to the nearest page
;
; In:
; DI = filename
;
_load_file:
inc dword [_nr_files]
;
; Open the file
;
mov ah,03dh
mov al,0
mov dx,di
int 021h
jc _error
mov [file_handle],ax
;
; Find filelength
;
mov ah,042h
mov al,2
mov bx,[file_handle]
mov cx,0
mov dx,0
int 021h
;
; Convert the filelength in DX:AX to a dword in EBX
;
movzx ebx,dx
shl ebx,16
mov bx,ax
;
; Record the length of the module in boot parameter table
;
mov esi,[_nr_files]
dec esi
mov [_module_lengths+esi*4],ebx
;
; Convert the length into
;
mov [size_mod_4k],bx
and word [size_mod_4k],0fffh
shr ebx,12
mov [size_div_4k],ebx
;
; Seek to beginning of file
;
mov ah,042h
mov al,0
mov bx,[file_handle]
mov cx,0
mov dx,0
int 021h
jc _error
;
; Read in the module
;
push ds
;
; Convert the linear point to the load address into a seg:off
;
mov edi,[next_load_base]
call convert_to_seg
mov dx,di
;
; Move onto the next position in prepartion for a future read
;
mov eax,[size_div_4k]
mov bx,[size_mod_4k]
cmp bx,0
je l20
inc eax
l20:
shl eax,0ch
add [next_load_base],eax
push fs
pop ds
;
; We read the kernel in 4k chunks (because)
;
l6:
;
; Check if we have read it all
;
mov ax,[es:size_div_4k]
cmp ax,0
je l5
;
; Make the call (dx was loaded above)
;
mov ah,3fh
mov bx,[es:file_handle]
mov cx,01000h
int 21h
;
; We move onto the next pointer by altering ds
;
mov ax,ds
add ax,0100h
mov ds,ax
dec word [es:size_div_4k]
jmp l6
l5:
;
; Read the last section
;
mov ah,3fh
mov bx,[es:file_handle]
mov cx,[es:size_mod_4k]
int 21h
pop ds
jnc _no_error
jmp _error
_no_error:
ret
;
; In: EDI = address
; Out: FS = segment
@ -330,11 +217,14 @@ convert_to_seg:
push eax
mov eax,edi
shr eax,16
shl eax,12
mov fs,ax
; shr eax,16
; shl eax,12
; mov fs,ax
shr eax, 4
mov fs, ax
and edi, 0xf
and edi,0ffffh
; and edi,0ffffh
pop eax
ret
@ -342,24 +232,541 @@ convert_to_seg:
;
; Print string in DS:DI
;
_print_string:
push ax
push dx
push di
mov ah,02h
l3:
mov dl,[di]
cmp dl,0
je l4
int 021h
print_string:
push ebp
mov bp, sp
push eax
push edx
push edi
mov ax, 0x0200
.loop:
mov dl, [di]
cmp dl, 0
je .end_loop
cmp dl, '%'
jne .print_char
inc di
jmp l3
l4:
pop di
mov dl, [di]
cmp dl, 'a'
jne .not_ax
push eax
mov eax, [ss:bp - 4]
call print_ax
pop eax
jmp .next_char
.not_ax:
cmp dl, 'A'
jne .not_eax
push eax
mov eax, [ss:bp - 4]
call print_eax
pop eax
jmp .next_char
.not_eax:
cmp dl, 'c'
jne .not_cx
push ax
mov ax, cx
call print_ax
pop ax
jmp .next_char
.not_cx:
.print_char:
int 0x21
.next_char:
inc di
jmp .loop
.end_loop:
pop edi
pop edx
pop eax
pop ebp
ret
;
; print_ax - print the number in the ax register
;
print_ax:
push ax
push bx
push cx
push dx
mov bx, ax
mov ax, 0x0200
mov cx, 4
.loop:
mov dx, bx
shr dx, 12
and dl, 0x0f
cmp dl, 0x0a
jge .hex_val
add dl, '0'
jmp .not_hex
.hex_val:
add dl, 'a' - 10
.not_hex:
int 0x21
shl bx, 4
dec cx
jnz .loop
pop dx
pop cx
pop bx
pop ax
ret
print_eax:
push eax
push ebx
push ecx
push edx
mov ebx, eax
mov ax, 0x0200
mov cx, 8
.loop:
mov edx, ebx
shr edx, 28
and dl, 0x0f
cmp dl, 0x0a
jge .hex_val
add dl, '0'
jmp .not_hex
.hex_val:
add dl, 'a' - 10
.not_hex:
int 0x21
shl ebx, 4
dec cx
jnz .loop
pop edx
pop ecx
pop ebx
pop eax
ret
STRUC DOS_HDR
e_magic: resw 1
e_cblp: resw 1
e_cp: resw 1
e_crlc: resw 1
e_cparhdr: resw 1
e_minalloc: resw 1
e_maxalloc: resw 1
e_ss: resw 1
e_sp: resw 1
e_csum: resw 1
e_ip: resw 1
e_cs: resw 1
e_lfarlc: resw 1
e_ovno: resw 1
e_res: resw 4
e_oemid: resw 1
e_oeminfo: resw 1
e_res2: resw 10
e_lfanew: resd 1
ENDSTRUC
STRUC NT_HDRS
nth_sig: resd 1
ntf_mach: resw 1
ntf_num_secs: resw 1
ntf_timestamp: resd 1
ntf_symtab_ptr: resd 1
ntf_num_syms: resd 1
ntf_opt_hdr_sz: resw 1
ntf_chars: resw 1
nto_magic: resw 1
nto_mjr_lnk_vr: resb 1
nto_mnr_lnk_vr: resb 1
nto_code_sz: resd 1
nto_data_sz: resd 1
nto_bss_sz: resd 1
nto_entry_offs: resd 1
nto_code_offs: resd 1
nto_data_offs: resd 1
nto_image_base: resd 1
nto_sec_align: resd 1
nto_file_align: resd 1
nto_mjr_os_ver: resw 1
nto_Mnr_os_ver: resw 1
nto_mjr_img_vr: resw 1
nto_Mnr_img_vr: resw 1
nto_mjr_subsys: resw 1
nto_mnr_subsys: resw 1
nto_w32_ver: resd 1
nto_image_sz: resd 1
nto_hdr_sz: resd 1
nto_chksum: resd 1
nto_subsys: resw 1
nto_dll_chars: resw 1
nto_stk_res_sz: resd 1
nto_stk_cmt_sz: resd 1
nto_hp_res_sz: resd 1
nto_hp_cmt_sz: resd 1
nto_ldr_flags: resd 1
nto_dir_cnt: resd 1
nto_dir_ent: resq 16
ENDSTRUC
STRUC DATA_DIR
dd_rva: resd 1
dd_sz: resd 1
ENDSTRUC
STRUC SCN_HDR
se_name: resb 8
se_vsz: resd 1
se_vaddr: resd 1
se_rawsz: resd 1
se_raw_ofs: resd 1
se_reloc_ofs: resd 1
se_lnum_ofs: resd 1
se_num_relocs: resw 1
se_num_lnums: resw 1
se_chars: resd 1
ENDSTRUC
;
; pe_load_module - load a PE module into memory
;
; DI - Filename
;
; [_nr_files] - total files loaded (incremented)
; [next_load_base] - load base for file (updated to next loc)
; [_module_lengths] - correct slot is set.
;
pe_load_module:
push dx
push ds
push ds
pop es
mov eax, [next_load_base]
mov [load_base], eax
DPRINT 'next_load_base %A', 13, 10, 0
;
; Open the file
;
mov ax, 0x3d00
mov dx, di
int 0x21
jnc .open_good
jmp .error
.open_good:
mov [file_handle],ax
;
; Seek to beginning of file
;
mov ax,0x4200
mov bx, [file_handle]
mov cx, 0
mov dx, 0
int 0x21
jnc .rewind_good
jmp .error
.rewind_good:
;
; Compute load address for PE headers
;
mov edi,[load_base]
call convert_to_seg
mov dx,di
push fs
pop ds
;
; Load the headers
;
mov ax, 0x3f00
mov bx, [es:file_handle]
mov cx, 0x1000
int 0x21
;
; Check DOS MZ Header
;
mov bx, dx
mov ax, word [bx + e_magic]
cmp ax, 'MZ'
je .mz_hdr_good
push es
pop ds
mov dx, bad_mz_msg
mov di, dx
call print_string
jmp .error
.mz_hdr_good:
;
; Check PE Header
;
mov eax, dword [bx + e_lfanew]
DPRINT 'lfanew %A ', 0
add bx, ax
mov eax, dword [bx + nth_sig]
cmp eax, 0x00004550
je .pe_hdr_good
push es
pop ds
mov dx, bad_pe_msg
mov di, dx
call print_string
jmp .error
.pe_hdr_good:
;
; Get header size and bump next_load_base
;
mov eax, [bx + nto_hdr_sz]
DPRINT 'header size %A ', 0
add dword [es:next_load_base], eax
;
; Setup section pointer
;
mov ax, [bx + ntf_num_secs]
DPRINT 'num sections %a', 13, 10, 0
mov [es:num_sections], ax
add bx, NT_HDRS_size
mov [es:cur_section], bx
mov [es:cur_section + 2], ds
;
; Load each section or fill with zeroes
;
.scn_loop:
;
; Compute size of data to load from file
;
mov eax, [bx + se_rawsz]
DPRINT 'raw size %A ', 0
cmp eax, 0
jne .got_data
jmp .no_data
.got_data:
mov [es:size_mod_4k], ax
and word [es:size_mod_4k], 0x0fff
shr eax, 12
mov dword [es:size_div_4k], eax
;
; Seek to section offset
;
mov eax, [bx + se_raw_ofs]
DPRINT 'raw offset %A ', 0
mov dx, ax
shr eax, 16
mov cx, ax
mov ax,0x4200
mov bx, [es:file_handle]
int 0x21
jnc .seek_good
jmp .error
.seek_good:
;
; Load the base pointer
;
mov edi,[es:next_load_base]
call convert_to_seg
mov dx, di
push fs
pop ds
;
; Read data in 4k chunks
;
.do_chunk:
;
; Check if we have read it all
;
mov eax, [es:size_div_4k]
cmp eax, 0
je .chunk_done
;
; Make the call (dx was loaded above)
;
mov ax, 0x3f00
mov bx, [es:file_handle]
mov cx, 0x1000
int 0x21
; FIXME: should check return status and count
;
; We move onto the next pointer by altering ds
;
mov ax, ds
add ax, 0x0100
mov ds, ax
dec word [es:size_div_4k]
jmp .do_chunk
.chunk_done:
;
; Read the last section
;
mov ax, 0x3f00
mov bx, [es:file_handle]
mov cx, [es:size_mod_4k]
int 0x21
jnc .last_read_good
jmp .error
.last_read_good:
.no_data:
;
; Zero out uninitialized data sections
;
lds bx, [es:cur_section]
mov eax, dword [bx + se_chars]
DPRINT 'section chars %A', 13, 10, 0
test dword [bx + se_chars], 0x80
jz .no_fill
;
; Compute size of section to zero fill
;
mov eax, [bx + se_vsz]
cmp eax, 0
je .no_fill
mov [es:size_mod_4k], ax
and word [es:size_mod_4k], 0x0fff
shr eax, 12
mov [size_div_4k], eax
;
; Load the base pointer
;
mov edi,[es:next_load_base]
call convert_to_seg
mov dx, di
push fs
pop ds
.do_fill:
;
; Check if we have read it all
;
mov eax, [es:size_div_4k]
cmp eax, 0
je .fill_done
;
; Zero out a chunk
;
mov ax, 0x0000
mov cx, 0x1000
push di
push es
push ds
pop es
rep stosb
pop es
pop di
;
; We move onto the next pointer by altering ds
;
mov ax, ds
add ax, 0x0100
mov ds, ax
dec word [es:size_div_4k]
jmp .do_fill
.fill_done:
;
; Read the last section
;
mov ax, 0x0000
mov cx, [es:size_mod_4k]
push di
push es
push ds
pop es
rep stosb
pop es
pop di
.no_fill:
;
; Update raw data offset in section header
;
lds bx, [es:cur_section]
mov eax, [es:next_load_base]
sub eax, [es:load_base]
DPRINT 'new raw offset %A ', 0
mov [bx + se_raw_ofs], eax
;
; Update next_load_base
;
mov eax, [bx + se_vsz]
DPRINT 'scn virtual sz %A ', 0
and eax, 0xfffff000
add dword [es:next_load_base], eax
test dword [bx + se_vsz], 0xfff
jz .even_scn
add dword [es:next_load_base], 0x1000
.even_scn:
mov eax, [es:next_load_base]
DPRINT 'next load base %A', 13, 10, 0
;
; Setup for next section or exit loop
;
dec word [es:num_sections]
jz .scn_done
add bx, SCN_HDR_size
mov [es:cur_section], bx
jmp .scn_loop
.scn_done:
;
; Update module_length
;
mov eax, [es:next_load_base]
sub eax, [es:load_base]
mov esi, [es:_nr_files]
mov [es:_module_lengths + esi * 4], eax
inc dword [es:_nr_files]
pop ds
pop dx
ret
.error:
push es
pop ds
mov di, err_msg
call print_string
jmp exit
;
; Handle of the currently open file
;
@ -375,6 +782,10 @@ size_mod_4k dw 0
;
size_div_4k dd 0
load_base dd 0
num_sections dw 0
cur_section dd 0
;
;
;
@ -383,14 +794,12 @@ last_addr dw 0
;
; Generic error message
;
err_msg db 'Error during operation',0
err_msg db 'Error during operation',10, 13, 0
bad_mz_msg db 'Module has bad MZ header', 10, 13, 0
bad_pe_msg db 'Module has bad PE header', 10, 13, 0
rostitle db '',0
;
;
;
loading_msg db 'Loading: ',0
death_msg: db 'death', 0
death_msg db 'death', 0
filelength_lo dw 0
filelength_hi dw 0

View file

@ -35,8 +35,8 @@ LOADERS = dos
#
DEVICE_DRIVERS = blue ide keyboard mouse null parallel serial vidport
# DEVICE_DRIVERS = beep event floppy ide_test sound test test1
FS_DRIVERS = minix vfat ext2
# FS_DRIVERS = template
FS_DRIVERS = vfat
# FS_DRIVERS = minix ext2 template
KERNEL_SERVICES = $(DEVICE_DRIVERS) $(FS_DRIVERS)
APPS = args hello shell test cat bench

View file

@ -264,6 +264,7 @@ MmUnlockPages
MmUnlockPagableImageSection
MmUnmapIoSpace
MmUnmapLockedPages
NtCreateToken
ObDereferenceObject
ObReferenceObjectByHandle
ObReferenceObjectByPointer
@ -356,6 +357,7 @@ ZwClose
ZwCreateDirectoryObject
ZwCreateFile
ZwCreateKey
ZwCreateToken
ZwDeleteKey
ZwEnumerateKey
ZwEnumerateValueKey

View file

@ -121,7 +121,7 @@ asmlinkage void _main(boot_param* _bp)
boot_param bp;
unsigned int last_kernel_address;
memset((void *)&edata,0,((int)&end)-((int)&edata));
// memset((void *)&edata,0,((int)&end)-((int)&edata));
/*
* Copy the parameters to a local buffer because lowmem will go away
@ -169,12 +169,14 @@ asmlinkage void _main(boot_param* _bp)
DPRINT("%d files loaded\n",bp.nr_files);
start = KERNEL_BASE + PAGE_ROUND_UP(bp.module_length[0]);
start1 = start+PAGE_ROUND_UP(bp.module_length[1]);
// start1 = start+PAGE_ROUND_UP(bp.module_length[1]);
start1 = start + bp.module_length[1];
for (i=1;i<bp.nr_files;i++)
{
DPRINT("process module at %08lx\n", start);
LdrProcessDriver((PVOID)start);
start=start+PAGE_ROUND_UP(bp.module_length[i]);
// start=start+PAGE_ROUND_UP(bp.module_length[i]);
start = start + bp.module_length[i];
}
/*

View file

@ -53,6 +53,7 @@ NTSTATUS LdrProcessDriver(PVOID ModuleLoadBase);
PMODULE_OBJECT LdrLoadModule(PUNICODE_STRING Filename);
PMODULE_OBJECT LdrProcessModule(PVOID ModuleLoadBase);
PVOID LdrGetExportAddress(PMODULE_OBJECT ModuleObject, char *Name, unsigned short Hint);
static PMODULE_OBJECT LdrOpenModule(PUNICODE_STRING Filename);
static PIMAGE_SECTION_HEADER LdrPEGetEnclosingSectionHeader(DWORD RVA,
PMODULE_OBJECT ModuleObject);
static NTSTATUS LdrCreateModule(PVOID ObjectBody,
@ -252,38 +253,13 @@ LdrLoadModule(PUNICODE_STRING Filename)
PWSTR RemainingPath;
UNICODE_STRING ModuleName;
DPRINT("Loading Module %W...\n", Filename);
/* Check for module already loaded */
wcscpy(NameBuffer, MODULE_ROOT_NAME);
if (wcsrchr(Filename->Buffer, '\\') != 0)
{
wcscat(NameBuffer, wcsrchr(Filename->Buffer, '\\') + 1);
}
else
{
wcscat(NameBuffer, Filename->Buffer);
}
ModuleName.Length = ModuleName.MaximumLength = wcslen(NameBuffer);
ModuleName.Buffer = NameBuffer;
InitializeObjectAttributes(&ObjectAttributes,
&ModuleName,
0,
NULL,
NULL);
Status = ObFindObject(&ObjectAttributes,
(PVOID *) &ModuleObject,
&RemainingPath);
CHECKPOINT;
if (NT_SUCCESS(Status) && *RemainingPath == 0)
if ((ModuleObject = LdrOpenModule(Filename)) != NULL)
{
return ModuleObject;
}
CHECKPOINT;
if (!wcsncmp(Filename->Buffer, MODULE_ROOT_NAME, wcslen(MODULE_ROOT_NAME)))
{
return 0;
}
DPRINT("Loading Module %W...\n", Filename);
/* Open the Module */
InitializeObjectAttributes(&ObjectAttributes,
@ -393,6 +369,46 @@ LdrProcessModule(PVOID ModuleLoadBase)
return 0;
}
static PMODULE_OBJECT
LdrOpenModule(PUNICODE_STRING Filename)
{
NTSTATUS Status;
WCHAR NameBuffer[60];
UNICODE_STRING ModuleName;
OBJECT_ATTRIBUTES ObjectAttributes;
PMODULE_OBJECT ModuleObject;
PWSTR RemainingPath;
wcscpy(NameBuffer, MODULE_ROOT_NAME);
if (wcsrchr(Filename->Buffer, '\\') != 0)
{
wcscat(NameBuffer, wcsrchr(Filename->Buffer, '\\') + 1);
}
else
{
wcscat(NameBuffer, Filename->Buffer);
}
ModuleName.Length = ModuleName.MaximumLength = wcslen(NameBuffer);
ModuleName.Buffer = NameBuffer;
InitializeObjectAttributes(&ObjectAttributes,
&ModuleName,
0,
NULL,
NULL);
Status = ObFindObject(&ObjectAttributes,
(PVOID *) &ModuleObject,
&RemainingPath);
CHECKPOINT;
if (NT_SUCCESS(Status) && (RemainingPath == NULL || *RemainingPath == 0))
{
DPRINT("Module %W at %p\n", Filename, ModuleObject);
return ModuleObject;
}
return NULL;
}
PVOID
LdrGetExportAddress(PMODULE_OBJECT ModuleObject,
char *Name,
@ -617,12 +633,14 @@ LdrPEProcessModule(PVOID ModuleLoadBase)
/* Check to make sure that import lib is kernel */
pName = (PCHAR) DriverBase +
ImportModuleDirectory->dwRVAModuleName;
#if 0
if (!strcmp(pName, "ntoskrnl.exe") || !strcmp(pName, "HAL.dll"))
{
LibraryModuleObject = NULL;
DPRINT("Kernel imports\n");
}
else
#endif
{
wcscpy(NameBuffer, MODULE_ROOT_NAME);
for (Idx = 0; NameBuffer[Idx] != 0; Idx++)
@ -799,19 +817,21 @@ LdrPEGetExportAddress(PMODULE_OBJECT ModuleObject,
OrdinalList = (PWORD)((DWORD)ExportDirectory->AddressOfNameOrdinals -
Delta + ModuleObject->Base);
DPRINT("Delta:%08x\n", Delta);
DPRINT("Func:%08x RVA:%08x Name:%08x RVA:%08x Ord:%08x RVA:%08x\n", FunctionList,
ExportDirectory->AddressOfFunctions, NameList,
ExportDirectory->AddressOfNames, OrdinalList,
ExportDirectory->AddressOfNameOrdinals);
DPRINT("Func:%08x RVA:%08x Name:%08x RVA:%08x\nOrd:%08x RVA:%08x ",
FunctionList, ExportDirectory->AddressOfFunctions,
NameList, ExportDirectory->AddressOfNames,
OrdinalList, ExportDirectory->AddressOfNameOrdinals);
DPRINT("NumNames:%d NumFuncs:%d\n", ExportDirectory->NumberOfNames,
ExportDirectory->NumberOfFunctions);
for(;;);
ExportAddress = 0;
if (Name != NULL)
{
for (Idx = 0; Idx < ExportDirectory->NumberOfNames; Idx++)
{
DPRINT(" Name:%s NameList[%d]:%s\n", Name, Idx, NameList[Idx]);
DPRINT(" Name:%s NameList[%d]:%s\n",
Name,
Idx,
(DWORD) ModuleObject->Base + NameList[Idx]);
if (!strcmp(Name, (PCHAR) ((DWORD)ModuleObject->Base + NameList[Idx])))
{
ExportAddress = (PVOID) ((DWORD)ModuleObject->Base +

View file

@ -69,6 +69,7 @@ HalGetInterruptVector
KeBugCheck
KeBugCheckEx
KeFlushIoBuffers
KeGetCurrentIrql
KeInitializeDpc
KeInitializeEvent
KeInitializeSpinLock
@ -78,6 +79,8 @@ KeStallExecutionProcessor
KeSynchronizeExecution
KeRaiseIrql
KeWaitForSingleObject
HalGetBusDataByOffset
HalSetBusDataByOffset
InitializeObjectAttributes
IoAllocateController
IoAttachDeviceToDeviceStack
@ -90,6 +93,7 @@ IoCreateDevice
IoCreateStreamFileObject
IoCreateSymbolicLink
IoDeleteController
IoDeleteDevice
IoDisconnectInterrupt
IoFreeController
IoGetCurrentIrpStackLocation
@ -102,8 +106,11 @@ IoStartPacket
IoStartNextPacket
IoStartNextPacketByKey
IoStartTimer
IoStopTimer
MmGetSystemAddressForMdl
MmMapIoSpace
RtlAnsiStringToUnicodeString
RtlCompareMemory
RtlConvertLongToLargeInteger
RtlConvertUlongToLargeInteger
RtlCopyMemory
@ -115,6 +122,7 @@ RtlInitUnicodeString
RtlLargeIntegerAdd
RtlLargeIntegerGreaterThan
RtlLargeIntegerShiftRight
RtlMoveMemory
RtlTimeFieldsToTime
RtlTimeToTimeFields
RtlZeroMemory

View file

@ -260,7 +260,7 @@ NTSTATUS PsInitializeThread(HANDLE ProcessHandle,
Thread->Cid.UniqueThread = (HANDLE)InterlockedIncrement(
&PiNextThreadUniqueId);
Thread->Cid.UniqueProcess = (HANDLE)Thread->ThreadsProcess->UniqueProcessId;
DbgPrint("Thread->Cid.UniqueThread %d\n",Thread->Cid.UniqueThread);
DPRINT("Thread->Cid.UniqueThread %d\n",Thread->Cid.UniqueThread);
ObReferenceObjectByPointer(Thread,
THREAD_ALL_ACCESS,
PsThreadType,