mirror of https://github.com/lianthony/NT4.0
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
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 );
|
|
}
|