Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

325 lines
6.9 KiB

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
dllloadr.c
Abstract:
This module implements the OS/2 V2.0 Loader API Calls
Author:
Steve Wood (stevewo) 20-Sep-1989
Revision History:
--*/
#define INCL_OS2V20_TASKING
#define INCL_OS2V20_LOADER
#define INCL_OS2V20_ERRORS
#include "os2dll.h"
#include "os2dll16.h"
APIRET
DosLoadModule(
OUT PSZ ErrorText,
IN ULONG ErrorTextLength,
IN PSZ ModuleName,
OUT PHMODULE ModuleHandle
)
{
NTSTATUS Status;
ULONG Characteristics;
STRING ModuleNameString;
UNICODE_STRING ModuleNameString_U;
APIRET RetCode;
try {
Od2InitMBString( &ModuleNameString, ModuleName );
*ModuleHandle = 0;
Od2ProbeForWrite(ErrorText,ErrorTextLength,1);
} except( EXCEPTION_EXECUTE_HANDLER ) {
Od2ExitGP();
}
//
// UNICODE conversion -
//
RetCode = Od2MBStringToUnicodeString(
&ModuleNameString_U,
&ModuleNameString,
TRUE);
if (RetCode)
{
#if DBG
// DbgPrint("DosLoadModule: no memory for Unicode Conversion\n");
#endif
return RetCode;
}
Status = LdrLoadDll( NULL,
&Characteristics,
&ModuleNameString_U,
(PVOID *)ModuleHandle
);
RtlFreeUnicodeString (&ModuleNameString_U);
if (NT_SUCCESS( Status )) {
return( NO_ERROR );
}
else {
return( Or2MapNtStatusToOs2Error(Status, ERROR_FILE_NOT_FOUND) );
}
}
APIRET
DosFreeModule(
IN HMODULE ModuleHandle
)
{
NTSTATUS Status;
Status = LdrUnloadDll( (PVOID)ModuleHandle );
if (NT_SUCCESS( Status )) {
return( NO_ERROR );
}
else {
return( Or2MapNtStatusToOs2Error(Status, ERROR_INVALID_HANDLE) );
}
}
APIRET
DosQueryProcAddr(
IN HMODULE ModuleHandle,
IN ULONG ProcOrdinal,
IN PSZ ProcName OPTIONAL,
OUT PFN *ProcAddress
)
{
NTSTATUS Status;
STRING ProcedureNameString;
PSTRING ProcedureName;
if (ARGUMENT_PRESENT( ProcName )) {
ProcedureName = &ProcedureNameString;
try {
Od2InitMBString( ProcedureName, ProcName );
*ProcAddress = 0;
} except( EXCEPTION_EXECUTE_HANDLER ) {
Od2ExitGP();
}
}
else {
ProcedureName = NULL;
try {
*ProcAddress = 0;
} except( EXCEPTION_EXECUTE_HANDLER ) {
Od2ExitGP();
}
}
Status = LdrGetProcedureAddress( (PVOID)ModuleHandle,
ProcedureName,
ProcOrdinal,
(PVOID *)ProcAddress
);
if (NT_SUCCESS( Status )) {
return( NO_ERROR );
}
else {
return( Or2MapNtStatusToOs2Error(Status, ERROR_PROC_NOT_FOUND) );
}
}
APIRET
DosQueryProcType(
IN HMODULE ModuleHandle,
IN ULONG ProcOrdinal,
IN PSZ ProcName OPTIONAL,
OUT PULONG *ProcType
)
{
APIRET rc;
PFN ProcAddress;
rc = DosQueryProcAddr( ModuleHandle, ProcOrdinal, ProcName, &ProcAddress );
if (rc == NO_ERROR) {
try {
*ProcType = (PULONG)(PT_32BIT);
} except( EXCEPTION_EXECUTE_HANDLER ) {
Od2ExitGP();
}
}
return( rc );
}
APIRET
DosQueryModuleHandle(
IN PSZ ModuleName,
OUT PHMODULE ModuleHandle
)
{
UNREFERENCED_PARAMETER(ModuleName);
UNREFERENCED_PARAMETER(ModuleHandle);
return( ERROR_INVALID_FUNCTION );
}
APIRET
DosQueryModuleName(
IN HMODULE ModuleHandle,
IN ULONG ModuleNameLength,
OUT PSZ ModuleName
)
{
UNREFERENCED_PARAMETER(ModuleHandle);
UNREFERENCED_PARAMETER(ModuleNameLength);
UNREFERENCED_PARAMETER(ModuleName);
return( ERROR_INVALID_FUNCTION );
}
APIRET
DosGetResource(
IN HMODULE ModuleHandle,
IN ULONG ResourceTypeId,
IN ULONG ResourceNameId,
OUT PVOID *ResourceBaseAddress
)
{
PVOID DllHandle;
NTSTATUS Status;
PIMAGE_RESOURCE_DATA_ENTRY ResourceEntry;
ULONG IdPath[ 3 ];
if (ModuleHandle != NULL) {
DllHandle = (PVOID) ModuleHandle;
}
else {
DllHandle = (PVOID) NtCurrentPeb()->ImageBaseAddress;
}
try {
*ResourceBaseAddress = 0;
} except( EXCEPTION_EXECUTE_HANDLER ) {
Od2ExitGP();
}
IdPath[ 0 ] = ResourceTypeId;
IdPath[ 1 ] = ResourceNameId;
IdPath[ 2 ] = 0; // language neutral resource
Status = LdrFindResource_U( DllHandle,
IdPath,
3,
&ResourceEntry
);
if (NT_SUCCESS( Status )) {
Status = LdrAccessResource( DllHandle,
ResourceEntry,
ResourceBaseAddress,
(PULONG)NULL
);
}
if (!NT_SUCCESS( Status )) {
return( ERROR_INVALID_PARAMETER );
}
else {
return( NO_ERROR );
}
}
APIRET
DosQueryResourceSize(
IN HMODULE ModuleHandle,
IN ULONG ResourceTypeId,
IN ULONG ResourceNameId,
OUT PULONG ResourceSize
)
{
PVOID DllHandle;
NTSTATUS Status;
PIMAGE_RESOURCE_DATA_ENTRY ResourceEntry;
ULONG IdPath[ 3 ];
if (ModuleHandle != NULL) {
DllHandle = (PVOID) ModuleHandle;
}
else {
DllHandle = (PVOID) NtCurrentPeb()->ImageBaseAddress;
}
try {
*ResourceSize = 0;
} except( EXCEPTION_EXECUTE_HANDLER ) {
Od2ExitGP();
}
IdPath[ 0 ] = ResourceTypeId;
IdPath[ 1 ] = ResourceNameId;
IdPath[ 2 ] = 0; // language neutral resource
Status = LdrFindResource_U( DllHandle,
IdPath,
3,
&ResourceEntry
);
if (NT_SUCCESS( Status )) {
Status = LdrAccessResource( DllHandle,
ResourceEntry,
NULL,
ResourceSize
);
}
if (!NT_SUCCESS( Status )) {
return( ERROR_INVALID_PARAMETER );
}
else {
return( NO_ERROR );
}
}
APIRET
DosQueryAppType(
IN PSZ ImageFileName,
OUT PULONG AppTypeFlags
)
{
UNREFERENCED_PARAMETER(ImageFileName);
try {
*AppTypeFlags = FAPPTYP_NOTWINDOWCOMPAT;
} except( EXCEPTION_EXECUTE_HANDLER ) {
Od2ExitGP();
}
return( NO_ERROR );
}
APIRET
DosReplaceModule(
IN PSZ pszOldModule,
IN PSZ pszNewModule,
IN PSZ pszBackupModule
)
{
UNREFERENCED_PARAMETER(pszOldModule);
UNREFERENCED_PARAMETER(pszNewModule);
UNREFERENCED_PARAMETER(pszBackupModule);
return( ERROR_INVALID_FUNCTION );
}