/* INCLUDES ******************************************************************/
+#define LDR_HASH_TABLE_ENTRIES 32
+#define LDR_GET_HASH_ENTRY(x) (RtlUpcaseUnicodeChar((x)) & (LDR_HASH_TABLE_ENTRIES - 1))
+
+/* LdrpUpdateLoadCount2 flags */
+#define LDRP_UPDATE_REFCOUNT 0x01
+#define LDRP_UPDATE_DEREFCOUNT 0x02
+#define LDRP_UPDATE_PIN 0x03
+
+/* Loader flags */
+#define IMAGE_LOADER_FLAGS_COMPLUS 0x00000001
+#define IMAGE_LOADER_FLAGS_SYSTEM_GLOBAL 0x01000000
+
+typedef struct _LDRP_TLS_DATA
+{
+ LIST_ENTRY TlsLinks;
+ IMAGE_TLS_DIRECTORY TlsDirectory;
+} LDRP_TLS_DATA, *PLDRP_TLS_DATA;
+
+/* Global data */
+extern RTL_CRITICAL_SECTION LdrpLoaderLock;
+extern BOOLEAN LdrpInLdrInit;
+extern LIST_ENTRY LdrpHashTable[LDR_HASH_TABLE_ENTRIES];
+extern BOOLEAN ShowSnaps;
+extern UNICODE_STRING LdrpDefaultPath;
+extern HANDLE LdrpKnownDllObjectDirectory;
+extern ULONG LdrpNumberOfProcessors;
+extern ULONG LdrpFatalHardErrorCount;
+extern PUNICODE_STRING LdrpTopLevelDllBeingLoaded;
+extern PLDR_DATA_TABLE_ENTRY LdrpCurrentDllInitializer;
+extern UNICODE_STRING LdrApiDefaultExtension;
+extern BOOLEAN LdrpLdrDatabaseIsSetup;
+extern ULONG LdrpActiveUnloadCount;
+extern BOOLEAN LdrpShutdownInProgress;
+extern UNICODE_STRING LdrpKnownDllPath;
+extern PLDR_DATA_TABLE_ENTRY LdrpGetModuleHandleCache, LdrpLoadedDllHandleCache;
+
+/* ldrinit.c */
+NTSTATUS NTAPI LdrpRunInitializeRoutines(IN PCONTEXT Context OPTIONAL);
+VOID NTAPI LdrpInitializeThread(IN PCONTEXT Context);
+NTSTATUS NTAPI LdrpInitializeTls(VOID);
+NTSTATUS NTAPI LdrpAllocateTls(VOID);
+VOID NTAPI LdrpFreeTls(VOID);
+VOID NTAPI LdrpCallTlsInitializers(PVOID BaseAddress, ULONG Reason);
+BOOLEAN NTAPI LdrpCallInitRoutine(PDLL_INIT_ROUTINE EntryPoint, PVOID BaseAddress, ULONG Reason, PVOID Context);
+NTSTATUS NTAPI LdrpInitializeProcess(PCONTEXT Context, PVOID SystemArgument1);
+VOID NTAPI LdrpInitFailure(NTSTATUS Status);
+VOID NTAPI LdrpValidateImageForMp(IN PLDR_DATA_TABLE_ENTRY LdrDataTableEntry);
+
+/* ldrpe.c */
+NTSTATUS
+NTAPI
+LdrpSnapThunk(IN PVOID ExportBase,
+ IN PVOID ImportBase,
+ IN PIMAGE_THUNK_DATA OriginalThunk,
+ IN OUT PIMAGE_THUNK_DATA Thunk,
+ IN PIMAGE_EXPORT_DIRECTORY ExportEntry,
+ IN ULONG ExportSize,
+ IN BOOLEAN Static,
+ IN LPSTR DllName);
+
+NTSTATUS NTAPI
+LdrpWalkImportDescriptor(IN LPWSTR DllPath OPTIONAL,
+ IN PLDR_DATA_TABLE_ENTRY LdrEntry);
+
+
+/* ldrutils.c */
+NTSTATUS NTAPI
+LdrpGetProcedureAddress(IN PVOID BaseAddress,
+ IN PANSI_STRING Name,
+ IN ULONG Ordinal,
+ OUT PVOID *ProcedureAddress,
+ IN BOOLEAN ExecuteInit);
+
+PLDR_DATA_TABLE_ENTRY NTAPI
+LdrpAllocateDataTableEntry(IN PVOID BaseAddress);
+
+VOID NTAPI
+LdrpInsertMemoryTableEntry(IN PLDR_DATA_TABLE_ENTRY LdrEntry);
+
+NTSTATUS NTAPI
+LdrpLoadDll(IN BOOLEAN Redirected,
+ IN PWSTR DllPath OPTIONAL,
+ IN PULONG DllCharacteristics OPTIONAL,
+ IN PUNICODE_STRING DllName,
+ OUT PVOID *BaseAddress,
+ IN BOOLEAN CallInit);
+
+VOID NTAPI
+LdrpUpdateLoadCount2(IN PLDR_DATA_TABLE_ENTRY LdrEntry,
+ IN ULONG Flags);
+
+ULONG NTAPI
+LdrpClearLoadInProgress();
+
+NTSTATUS
+NTAPI
+LdrpSetProtection(PVOID ViewBase,
+ BOOLEAN Restore);
+
+BOOLEAN
+NTAPI
+LdrpCheckForLoadedDllHandle(IN PVOID Base,
+ OUT PLDR_DATA_TABLE_ENTRY *LdrEntry);
+
+BOOLEAN NTAPI
+LdrpCheckForLoadedDll(IN PWSTR DllPath,
+ IN PUNICODE_STRING DllName,
+ IN BOOLEAN Flag,
+ IN BOOLEAN RedirectedDll,
+ OUT PLDR_DATA_TABLE_ENTRY *LdrEntry);
+
+NTSTATUS NTAPI
+LdrpMapDll(IN PWSTR SearchPath OPTIONAL,
+ IN PWSTR DllPath2,
+ IN PWSTR DllName OPTIONAL,
+ IN PULONG DllCharacteristics,
+ IN BOOLEAN Static,
+ IN BOOLEAN Redirect,
+ OUT PLDR_DATA_TABLE_ENTRY *DataTableEntry);
+
+PVOID NTAPI
+LdrpFetchAddressOfEntryPoint(PVOID ImageBase);
+
+VOID NTAPI
+LdrpFreeUnicodeString(PUNICODE_STRING String);
+
+
/* FIXME: Cleanup this mess */
typedef NTSTATUS (NTAPI *PEPFUNC)(PPEB);
NTSTATUS LdrMapSections(HANDLE ProcessHandle,
PIMAGE_NT_HEADERS NTHeaders);
NTSTATUS LdrMapNTDllForProcess(HANDLE ProcessHandle,
PHANDLE NTDllSectionHandle);
-BOOLEAN LdrMappedAsDataFile(PVOID *BaseAddress);
ULONG
LdrpGetResidentSize(PIMAGE_NT_HEADERS NTHeaders);
-PEPFUNC LdrPEStartup (PVOID ImageBase,
- HANDLE SectionHandle,
- PLDR_DATA_TABLE_ENTRY* Module,
- PWSTR FullDosName);
-typedef BOOL
-(NTAPI *PDLLMAIN_FUNC)(HANDLE hInst,
- ULONG ul_reason_for_call,
- LPVOID lpReserved);
+NTSTATUS
+NTAPI
+LdrpLoadImportModule(IN PWSTR DllPath OPTIONAL,
+ IN LPSTR ImportName,
+ IN PVOID DllBase,
+ OUT PLDR_DATA_TABLE_ENTRY *DataTableEntry,
+ OUT PBOOLEAN Existing);
+
+VOID
+NTAPI
+LdrpFinalizeAndDeallocateDataTableEntry(IN PLDR_DATA_TABLE_ENTRY Entry);
+
extern HANDLE WindowsApiPort;
/* EOF */