1172 lines
26 KiB
C
1172 lines
26 KiB
C
/*++
|
|
|
|
Copyright (c) 1990 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
basedll.h
|
|
|
|
Abstract:
|
|
|
|
This module contains private function prototypes
|
|
and types for the 32-bit windows base APIs.
|
|
|
|
Author:
|
|
|
|
Mark Lucovsky (markl) 18-Sep-1990
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _BASEP_
|
|
#define _BASEP_
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif
|
|
|
|
#undef UNICODE
|
|
//
|
|
// Include Common Definitions.
|
|
//
|
|
|
|
#include <base.h>
|
|
#include <dbt.h>
|
|
|
|
#include <sxstypes.h>
|
|
|
|
//
|
|
// Include DLL definitions for CSR
|
|
//
|
|
|
|
#include "ntcsrdll.h"
|
|
#include "ntcsrsrv.h"
|
|
|
|
#define NOEXTAPI
|
|
#include <wdbgexts.h>
|
|
#include <ntdbg.h>
|
|
|
|
//
|
|
// Include message definitions for communicating between client and server
|
|
// portions of the Base portion of the Windows subsystem
|
|
//
|
|
|
|
#include "basemsg.h"
|
|
#include "winuserp.h"
|
|
#include "basesxs.h"
|
|
|
|
typedef struct _CMDSHOW {
|
|
WORD wMustBe2;
|
|
WORD wShowWindowValue;
|
|
} CMDSHOW, *PCMDSHOW;
|
|
|
|
typedef struct _LOAD_MODULE_PARAMS {
|
|
LPVOID lpEnvAddress;
|
|
LPSTR lpCmdLine;
|
|
PCMDSHOW lpCmdShow;
|
|
DWORD dwReserved;
|
|
} LOAD_MODULE_PARAMS, *PLOAD_MODULE_PARAMS;
|
|
|
|
typedef struct _RELATIVE_NAME {
|
|
STRING RelativeName;
|
|
HANDLE ContainingDirectory;
|
|
} RELATIVE_NAME, *PRELATIVE_NAME;
|
|
|
|
|
|
HANDLE BaseDllHandle;
|
|
HANDLE BaseNamedObjectDirectory;
|
|
|
|
PVOID BaseHeap;
|
|
RTL_HANDLE_TABLE BaseHeapHandleTable;
|
|
|
|
|
|
UNICODE_STRING BaseWindowsDirectory;
|
|
UNICODE_STRING BaseWindowsSystemDirectory;
|
|
#ifdef WX86
|
|
UNICODE_STRING BaseWindowsSys32x86Directory;
|
|
#endif
|
|
|
|
extern UNICODE_STRING BasePathVariableName;
|
|
extern UNICODE_STRING BaseTmpVariableName;
|
|
extern UNICODE_STRING BaseTempVariableName;
|
|
extern UNICODE_STRING BaseUserProfileVariableName;
|
|
extern UNICODE_STRING BaseDotVariableName;
|
|
extern UNICODE_STRING BaseDotTmpSuffixName;
|
|
extern UNICODE_STRING BaseDotComSuffixName;
|
|
extern UNICODE_STRING BaseDotPifSuffixName;
|
|
extern UNICODE_STRING BaseDotExeSuffixName;
|
|
|
|
UNICODE_STRING BaseDefaultPath;
|
|
UNICODE_STRING BaseDefaultPathAppend;
|
|
UNICODE_STRING BaseDllDirectory;
|
|
RTL_CRITICAL_SECTION BaseDllDirectoryLock;
|
|
PWSTR BaseCSDVersion;
|
|
WORD BaseCSDNumber;
|
|
WORD BaseRCNumber;
|
|
|
|
extern UNICODE_STRING BaseConsoleInput;
|
|
extern UNICODE_STRING BaseConsoleOutput;
|
|
extern UNICODE_STRING BaseConsoleGeneric;
|
|
UNICODE_STRING BaseUnicodeCommandLine;
|
|
ANSI_STRING BaseAnsiCommandLine;
|
|
|
|
LPSTARTUPINFOA BaseAnsiStartupInfo;
|
|
|
|
PBASE_STATIC_SERVER_DATA BaseStaticServerData;
|
|
|
|
#if defined(BUILD_WOW6432) || defined(_WIN64)
|
|
extern SYSTEM_BASIC_INFORMATION SysInfo;
|
|
#endif
|
|
|
|
extern UINT_PTR SystemRangeStart;
|
|
extern BOOLEAN BaseRunningInServerProcess;
|
|
|
|
ULONG BaseIniFileUpdateCount;
|
|
|
|
#define ROUND_UP_TO_PAGES(SIZE) (((ULONG_PTR)(SIZE) + (ULONG_PTR)BASE_SYSINFO.PageSize - 1) & ~((ULONG_PTR)BASE_SYSINFO.PageSize - 1))
|
|
#define ROUND_DOWN_TO_PAGES(SIZE) (((ULONG_PTR)(SIZE)) & ~((ULONG_PTR)BASE_SYSINFO.PageSize - 1))
|
|
|
|
#define BASE_COPY_FILE_CHUNK (64*1024)
|
|
#define BASE_MAX_PATH_STRING 4080
|
|
|
|
extern BOOLEAN BasepFileApisAreOem;
|
|
|
|
#define DATA_ATTRIBUTE_NAME L":$DATA"
|
|
#define DATA_ATTRIBUTE_LENGTH (sizeof( DATA_ATTRIBUTE_NAME ) - sizeof( WCHAR ))
|
|
|
|
extern WCHAR BasepDataAttributeType[];
|
|
|
|
#define CERTAPP_KEY_NAME L"\\Registry\\MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\AppCertDlls"
|
|
#define CERTAPP_ENTRYPOINT_NAME "CreateProcessNotify"
|
|
#define CERTAPP_EMBEDDED_DLL_NAME L"EmbdTrst.DLL"
|
|
#define CERTAPP_EMBEDDED_DLL_EP "ImageOkToRunOnEmbeddedNT"
|
|
RTL_CRITICAL_SECTION gcsAppCert;
|
|
LIST_ENTRY BasepAppCertDllsList;
|
|
|
|
RTL_CRITICAL_SECTION gcsAppCompat;
|
|
|
|
NTSTATUS
|
|
BasepConfigureAppCertDlls(
|
|
IN PWSTR ValueName,
|
|
IN ULONG ValueType,
|
|
IN PVOID ValueData,
|
|
IN ULONG ValueLength,
|
|
IN PVOID Context,
|
|
IN PVOID EntryContext
|
|
);
|
|
|
|
NTSTATUS
|
|
BasepSaveAppCertRegistryValue(
|
|
IN OUT PLIST_ENTRY ListHead,
|
|
IN PWSTR Name,
|
|
IN PWSTR Value OPTIONAL
|
|
);
|
|
|
|
|
|
typedef struct _BASEP_APPCERT_ENTRY {
|
|
LIST_ENTRY Entry;
|
|
UNICODE_STRING Name;
|
|
NTSTATUS (WINAPI *fPluginCertFunc)(LPCWSTR lpApplicationName,ULONG Reason);
|
|
} BASEP_APPCERT_ENTRY, *PBASEP_APPCERT_ENTRY;
|
|
|
|
extern RTL_QUERY_REGISTRY_TABLE BasepAppCertTable[];
|
|
|
|
#define APPCERT_IMAGE_OK_TO_RUN 1
|
|
#define APPCERT_CREATION_ALLOWED 2
|
|
#define APPCERT_CREATION_DENIED 3
|
|
|
|
|
|
__inline
|
|
BOOL
|
|
BasepIsDataAttribute(
|
|
ULONG Count,
|
|
const WCHAR *Name
|
|
)
|
|
{
|
|
return Count > DATA_ATTRIBUTE_LENGTH &&
|
|
!_wcsnicmp( &Name[(Count - DATA_ATTRIBUTE_LENGTH) / sizeof( WCHAR )],
|
|
BasepDataAttributeType,
|
|
DATA_ATTRIBUTE_LENGTH / sizeof( WCHAR ));
|
|
}
|
|
|
|
PUNICODE_STRING
|
|
Basep8BitStringToStaticUnicodeString(
|
|
IN LPCSTR SourceString
|
|
);
|
|
|
|
BOOL
|
|
Basep8BitStringToDynamicUnicodeString(
|
|
OUT PUNICODE_STRING UnicodeString,
|
|
IN LPCSTR lpSourceString
|
|
);
|
|
|
|
NTSTATUS
|
|
(*Basep8BitStringToUnicodeString)(
|
|
PUNICODE_STRING DestinationString,
|
|
PANSI_STRING SourceString,
|
|
BOOLEAN AllocateDestinationString
|
|
);
|
|
|
|
NTSTATUS
|
|
(*BasepUnicodeStringTo8BitString)(
|
|
PANSI_STRING DestinationString,
|
|
PUNICODE_STRING SourceString,
|
|
BOOLEAN AllocateDestinationString
|
|
);
|
|
|
|
ULONG
|
|
(*BasepUnicodeStringTo8BitSize)(
|
|
PUNICODE_STRING UnicodeString
|
|
);
|
|
|
|
ULONG
|
|
BasepUnicodeStringToAnsiSize(
|
|
PUNICODE_STRING UnicodeString
|
|
);
|
|
|
|
ULONG
|
|
BasepUnicodeStringToOemSize(
|
|
PUNICODE_STRING UnicodeString
|
|
);
|
|
|
|
ULONG
|
|
(*Basep8BitStringToUnicodeSize)(
|
|
PANSI_STRING AnsiString
|
|
);
|
|
|
|
ULONG
|
|
BasepAnsiStringToUnicodeSize(
|
|
PANSI_STRING AnsiString
|
|
);
|
|
|
|
ULONG
|
|
BasepOemStringToUnicodeSize(
|
|
PANSI_STRING OemString
|
|
);
|
|
|
|
HANDLE
|
|
BaseGetNamedObjectDirectory(
|
|
VOID
|
|
);
|
|
|
|
void
|
|
BaseDllInitializeMemoryManager( VOID );
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(*BASECLIENTCONNECTROUTINE)(
|
|
PVOID MustBeNull,
|
|
PVOID ConnectionInformation,
|
|
PULONG ConnectionInformationLength
|
|
);
|
|
|
|
|
|
POBJECT_ATTRIBUTES
|
|
BaseFormatObjectAttributes(
|
|
POBJECT_ATTRIBUTES ObjectAttributes,
|
|
PSECURITY_ATTRIBUTES SecurityAttributes,
|
|
PUNICODE_STRING ObjectName
|
|
);
|
|
|
|
PLARGE_INTEGER
|
|
BaseFormatTimeOut(
|
|
PLARGE_INTEGER TimeOut,
|
|
DWORD Milliseconds
|
|
);
|
|
|
|
ULONG
|
|
BaseSetLastNTError(
|
|
NTSTATUS Status
|
|
);
|
|
|
|
VOID
|
|
BaseSwitchStackThenTerminate(
|
|
PVOID CurrentStack,
|
|
PVOID NewStack,
|
|
DWORD ExitCode
|
|
);
|
|
|
|
VOID
|
|
BaseFreeStackAndTerminate(
|
|
PVOID OldStack,
|
|
DWORD ExitCode
|
|
);
|
|
|
|
NTSTATUS
|
|
BaseCreateStack(
|
|
HANDLE Process,
|
|
SIZE_T StackSize,
|
|
SIZE_T MaximumStackSize,
|
|
PINITIAL_TEB InitialTeb
|
|
);
|
|
|
|
VOID
|
|
BasepSwitchToFiber(
|
|
PFIBER CurrentFiber,
|
|
PFIBER NewFiber
|
|
);
|
|
|
|
VOID
|
|
BaseFiberStart(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
BaseThreadStart(
|
|
LPTHREAD_START_ROUTINE lpStartAddress,
|
|
LPVOID lpParameter
|
|
);
|
|
|
|
typedef DWORD (WINAPI *PPROCESS_START_ROUTINE)(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
BaseProcessStart(
|
|
PPROCESS_START_ROUTINE lpStartAddress
|
|
);
|
|
|
|
VOID
|
|
BaseThreadStartThunk(
|
|
LPTHREAD_START_ROUTINE lpStartAddress,
|
|
LPVOID lpParameter
|
|
);
|
|
|
|
VOID
|
|
BaseProcessStartThunk(
|
|
LPVOID lpProcessStartAddress,
|
|
LPVOID lpParameter
|
|
);
|
|
|
|
typedef enum _BASE_CONTEXT_TYPE {
|
|
BaseContextTypeProcess,
|
|
BaseContextTypeThread,
|
|
BaseContextTypeFiber
|
|
} BASE_CONTEXT_TYPE, *PBASE_CONTEXT_TYPE;
|
|
|
|
VOID
|
|
BaseInitializeContext(
|
|
PCONTEXT Context,
|
|
PVOID Parameter,
|
|
PVOID InitialPc,
|
|
PVOID InitialSp,
|
|
BASE_CONTEXT_TYPE ContextType
|
|
);
|
|
|
|
#if defined(WX86) || defined(_AXP64_)
|
|
NTSTATUS
|
|
BaseCreateWx86Tib(
|
|
HANDLE Process,
|
|
HANDLE Thread,
|
|
ULONG InitialPc,
|
|
ULONG CommittedStackSize,
|
|
ULONG MaximumStackSize,
|
|
BOOLEAN EmulateInitialPc
|
|
);
|
|
#endif
|
|
|
|
VOID
|
|
BaseFreeThreadStack(
|
|
HANDLE hProcess,
|
|
HANDLE hThread,
|
|
PINITIAL_TEB InitialTeb
|
|
);
|
|
|
|
#define BASE_PUSH_PROCESS_PARAMETERS_FLAG_APP_MANIFEST_PRESENT (0x00000001)
|
|
|
|
BOOL
|
|
BasePushProcessParameters(
|
|
DWORD dwFlags,
|
|
HANDLE Process,
|
|
PPEB Peb,
|
|
LPCWSTR ApplicationPathName,
|
|
LPCWSTR CurrentDirectory,
|
|
LPCWSTR CommandLine,
|
|
LPVOID Environment,
|
|
LPSTARTUPINFOW lpStartupInfo,
|
|
DWORD dwCreationFlags,
|
|
BOOL bInheritHandles,
|
|
DWORD dwSubsystem,
|
|
PVOID pAppCompatData,
|
|
DWORD cbAppCompatData
|
|
);
|
|
|
|
LPWSTR
|
|
BaseComputeProcessDllPath(
|
|
LPCWSTR AppName,
|
|
LPVOID Environment
|
|
);
|
|
|
|
LPWSTR
|
|
BaseComputeProcessSearchPath(
|
|
VOID
|
|
);
|
|
|
|
extern PCLDR_DATA_TABLE_ENTRY BasepExeLdrEntry;
|
|
|
|
VOID
|
|
BasepLocateExeLdrEntry(
|
|
IN PCLDR_DATA_TABLE_ENTRY Entry,
|
|
IN PVOID Context,
|
|
IN OUT BOOLEAN *StopEnumeration
|
|
);
|
|
|
|
FORCEINLINE
|
|
VOID
|
|
BasepCheckExeLdrEntry(
|
|
VOID
|
|
)
|
|
{
|
|
if (! BasepExeLdrEntry) {
|
|
LdrEnumerateLoadedModules(0,
|
|
&BasepLocateExeLdrEntry,
|
|
NtCurrentPeb()->ImageBaseAddress);
|
|
}
|
|
}
|
|
|
|
LPCWSTR
|
|
BasepEndOfDirName(
|
|
IN LPCWSTR FileName
|
|
);
|
|
|
|
DWORD
|
|
BaseDebugAttachThread(
|
|
LPVOID ThreadParameter
|
|
);
|
|
|
|
HANDLE
|
|
BaseFindFirstDevice(
|
|
PCUNICODE_STRING FileName,
|
|
LPWIN32_FIND_DATAW lpFindFileData
|
|
);
|
|
|
|
PUNICODE_STRING
|
|
BaseIsThisAConsoleName(
|
|
PCUNICODE_STRING FileNameString,
|
|
DWORD dwDesiredAccess
|
|
);
|
|
|
|
|
|
typedef ULONG (FAR WINAPI *CSRREMOTEPROCPROC)(HANDLE, CLIENT_ID *);
|
|
|
|
#if DBG
|
|
VOID
|
|
BaseHeapBreakPoint( VOID );
|
|
#endif
|
|
|
|
ULONG
|
|
BasepOfShareToWin32Share(
|
|
IN ULONG OfShare
|
|
);
|
|
|
|
//
|
|
// Data structure for CopyFileEx context
|
|
//
|
|
|
|
typedef struct _COPYFILE_CONTEXT {
|
|
LARGE_INTEGER TotalFileSize;
|
|
LARGE_INTEGER TotalBytesTransferred;
|
|
DWORD dwStreamNumber;
|
|
LPBOOL lpCancel;
|
|
LPVOID lpData;
|
|
LPPROGRESS_ROUTINE lpProgressRoutine;
|
|
} COPYFILE_CONTEXT, *LPCOPYFILE_CONTEXT;
|
|
|
|
//
|
|
// Data structure for tracking restart state
|
|
//
|
|
|
|
typedef struct _RESTART_STATE {
|
|
CSHORT Type;
|
|
CSHORT Size;
|
|
DWORD NumberOfStreams;
|
|
LARGE_INTEGER CreationTime;
|
|
LARGE_INTEGER WriteTime;
|
|
LARGE_INTEGER EndOfFile;
|
|
LARGE_INTEGER FileSize;
|
|
LARGE_INTEGER LastKnownGoodOffset;
|
|
DWORD CurrentStream;
|
|
DWORD Checksum;
|
|
} RESTART_STATE, *PRESTART_STATE, *LPRESTART_STATE;
|
|
|
|
#define SUCCESS_RETURNED_STATE 2
|
|
|
|
DWORD
|
|
BaseCopyStream(
|
|
LPCWSTR lpExistingFileName,
|
|
HANDLE hSourceFile,
|
|
ACCESS_MASK SourceFileAccess OPTIONAL,
|
|
LPCWSTR lpNewFileName,
|
|
HANDLE hTargetFile OPTIONAL,
|
|
LARGE_INTEGER *lpFileSize,
|
|
LPDWORD lpCopyFlags,
|
|
LPHANDLE lpDestFile,
|
|
LPDWORD lpCopySize,
|
|
LPCOPYFILE_CONTEXT *lpCopyFileContext,
|
|
LPRESTART_STATE lpRestartState OPTIONAL,
|
|
BOOL OpenFileAsReparsePoint,
|
|
DWORD dwReparseTag,
|
|
PDWORD DestFileFsAttributes
|
|
);
|
|
|
|
BOOL
|
|
BasepCopyFileExW(
|
|
LPCWSTR lpExistingFileName,
|
|
LPCWSTR lpNewFileName,
|
|
LPPROGRESS_ROUTINE lpProgressRoutine OPTIONAL,
|
|
LPVOID lpData OPTIONAL,
|
|
LPBOOL pbCancel OPTIONAL,
|
|
DWORD dwCopyFlags,
|
|
DWORD dwPrivCopyFlags,
|
|
LPHANDLE phSource OPTIONAL,
|
|
LPHANDLE phDest OPTIONAL
|
|
);
|
|
|
|
VOID
|
|
BaseMarkFileForDelete(
|
|
HANDLE File,
|
|
DWORD FileAttributes
|
|
);
|
|
|
|
|
|
PVOID
|
|
BasepMapModuleHandle(
|
|
IN HMODULE hModule,
|
|
IN BOOLEAN bResourcesOnly
|
|
);
|
|
|
|
ULONG_PTR
|
|
BaseDllMapResourceIdA(
|
|
PCSTR lpId
|
|
);
|
|
|
|
ULONG_PTR
|
|
BaseDllMapResourceIdW(
|
|
PCWSTR lpId
|
|
);
|
|
|
|
VOID
|
|
BaseDllFreeResourceId(
|
|
ULONG_PTR Id
|
|
);
|
|
|
|
//
|
|
// Data structures and interfaces used by dllini.c
|
|
//
|
|
|
|
typedef struct _INIFILE_CACHE {
|
|
struct _INIFILE_CACHE *Next;
|
|
ULONG EnvironmentUpdateCount;
|
|
UNICODE_STRING NtFileName;
|
|
PINIFILE_MAPPING_FILENAME FileMapping;
|
|
HANDLE FileHandle;
|
|
BOOLEAN WriteAccess;
|
|
BOOLEAN UnicodeFile;
|
|
BOOLEAN LockedFile;
|
|
ULONG EndOfFile;
|
|
PVOID BaseAddress;
|
|
SIZE_T CommitSize;
|
|
SIZE_T RegionSize;
|
|
ULONG UpdateOffset;
|
|
ULONG UpdateEndOffset;
|
|
ULONG DirectoryInformationLength;
|
|
FILE_BASIC_INFORMATION BasicInformation;
|
|
FILE_STANDARD_INFORMATION StandardInformation;
|
|
} INIFILE_CACHE, *PINIFILE_CACHE;
|
|
|
|
typedef enum _INIFILE_OPERATION {
|
|
FlushProfiles,
|
|
ReadKeyValue,
|
|
WriteKeyValue,
|
|
DeleteKey,
|
|
ReadKeyNames,
|
|
ReadSectionNames,
|
|
ReadSection,
|
|
WriteSection,
|
|
DeleteSection,
|
|
RefreshIniFileMapping
|
|
} INIFILE_OPERATION;
|
|
|
|
typedef struct _INIFILE_PARAMETERS {
|
|
INIFILE_OPERATION Operation;
|
|
BOOLEAN WriteOperation;
|
|
BOOLEAN Unicode;
|
|
BOOLEAN ValueBufferAllocated;
|
|
PINIFILE_MAPPING_FILENAME IniFileNameMapping;
|
|
PINIFILE_CACHE IniFile;
|
|
UNICODE_STRING BaseFileName;
|
|
UNICODE_STRING FileName;
|
|
UNICODE_STRING NtFileName;
|
|
ANSI_STRING ApplicationName;
|
|
ANSI_STRING VariableName;
|
|
UNICODE_STRING ApplicationNameU;
|
|
UNICODE_STRING VariableNameU;
|
|
BOOLEAN MultiValueStrings;
|
|
union {
|
|
//
|
|
// This structure filled in for write operations
|
|
//
|
|
struct {
|
|
LPSTR ValueBuffer;
|
|
ULONG ValueLength;
|
|
PWSTR ValueBufferU;
|
|
ULONG ValueLengthU;
|
|
};
|
|
//
|
|
// This structure filled in for read operations
|
|
//
|
|
struct {
|
|
ULONG ResultChars;
|
|
ULONG ResultMaxChars;
|
|
LPSTR ResultBuffer;
|
|
PWSTR ResultBufferU;
|
|
};
|
|
};
|
|
|
|
|
|
//
|
|
// Remaining fields only valid when parsing an on disk .INI file mapped into
|
|
// memory.
|
|
//
|
|
|
|
PVOID TextCurrent;
|
|
PVOID TextStart;
|
|
PVOID TextEnd;
|
|
|
|
ANSI_STRING SectionName;
|
|
ANSI_STRING KeywordName;
|
|
ANSI_STRING KeywordValue;
|
|
PANSI_STRING AnsiSectionName;
|
|
PANSI_STRING AnsiKeywordName;
|
|
PANSI_STRING AnsiKeywordValue;
|
|
UNICODE_STRING SectionNameU;
|
|
UNICODE_STRING KeywordNameU;
|
|
UNICODE_STRING KeywordValueU;
|
|
PUNICODE_STRING UnicodeSectionName;
|
|
PUNICODE_STRING UnicodeKeywordName;
|
|
PUNICODE_STRING UnicodeKeywordValue;
|
|
} INIFILE_PARAMETERS, *PINIFILE_PARAMETERS;
|
|
|
|
NTSTATUS
|
|
BaseDllInitializeIniFileMappings(
|
|
PBASE_STATIC_SERVER_DATA StaticServerData
|
|
);
|
|
|
|
NTSTATUS
|
|
BasepAcquirePrivilege(
|
|
ULONG Privilege,
|
|
PVOID *ReturnedState
|
|
);
|
|
|
|
NTSTATUS
|
|
BasepAcquirePrivilegeEx(
|
|
ULONG Privilege,
|
|
PVOID *ReturnedState
|
|
);
|
|
|
|
VOID
|
|
BasepReleasePrivilege(
|
|
PVOID StatePointer
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
BaseCreateThreadPoolThread(
|
|
PUSER_THREAD_START_ROUTINE Function,
|
|
PVOID Parameter,
|
|
HANDLE * ThreadHandle
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
BaseExitThreadPoolThread(
|
|
NTSTATUS Status
|
|
);
|
|
|
|
//
|
|
// Function for returning the volume name from a reparse point.
|
|
//
|
|
|
|
BOOL
|
|
BasepGetVolumeNameFromReparsePoint(
|
|
LPCWSTR lpszVolumeMountPoint,
|
|
LPWSTR lpszVolumeName,
|
|
DWORD cchBufferLength,
|
|
PBOOL ResultOfOpen
|
|
);
|
|
|
|
|
|
#if defined(_WIN64) || defined(BUILD_WOW6432)
|
|
|
|
//
|
|
// COM+ Support routines
|
|
//
|
|
|
|
NTSTATUS
|
|
BasepIsComplusILImage(
|
|
IN HANDLE SectionImageHandle,
|
|
IN PSECTION_IMAGE_INFORMATION SectionImageInformation,
|
|
OUT BOOLEAN *IsComplusILImage
|
|
);
|
|
|
|
#endif
|
|
|
|
|
|
//
|
|
// Definitions for memory handles used by Local/GlobalAlloc functions
|
|
//
|
|
|
|
typedef struct _BASE_HANDLE_TABLE_ENTRY {
|
|
USHORT Flags;
|
|
USHORT LockCount;
|
|
union {
|
|
PVOID Object; // Allocated handle
|
|
ULONG Size; // Handle to discarded obj.
|
|
};
|
|
} BASE_HANDLE_TABLE_ENTRY, *PBASE_HANDLE_TABLE_ENTRY;
|
|
|
|
#define BASE_HANDLE_MOVEABLE (USHORT)0x0002
|
|
#define BASE_HANDLE_DISCARDABLE (USHORT)0x0004
|
|
#define BASE_HANDLE_DISCARDED (USHORT)0x0008
|
|
#define BASE_HANDLE_SHARED (USHORT)0x8000
|
|
|
|
//
|
|
// Handles are 32-bit pointers to the u.Object field of a
|
|
// BASE_HANDLE_TABLE_ENTRY. Since this field is 4 bytes into the
|
|
// structure and the structures are always on 8 byte boundaries, we can
|
|
// test the 0x4 bit to see if it is a handle.
|
|
//
|
|
// In Sundown, these handles are 64-bit pointers to the u.Object field
|
|
// which is 8 bytes into the structure. Therefore, we should test the
|
|
// 0x8 bit to see if it is a handle.
|
|
//
|
|
//on sundown
|
|
// #define BASE_HANDLE_MARK_BIT (ULONG_PTR)0x00000008
|
|
//on 32 bit systems
|
|
// #define BASE_HANDLE_MARK_BIT (ULONG_PTR)0x00000004
|
|
//
|
|
|
|
#define BASE_HANDLE_MARK_BIT (ULONG_PTR)FIELD_OFFSET(BASE_HANDLE_TABLE_ENTRY,Object)
|
|
#define BASE_HEAP_FLAG_MOVEABLE HEAP_SETTABLE_USER_FLAG1
|
|
#define BASE_HEAP_FLAG_DDESHARE HEAP_SETTABLE_USER_FLAG2
|
|
|
|
|
|
ULONG BaseDllTag;
|
|
|
|
#define MAKE_TAG( t ) (RTL_HEAP_MAKE_TAG( BaseDllTag, t ))
|
|
|
|
#define TMP_TAG 0
|
|
#define BACKUP_TAG 1
|
|
#define INI_TAG 2
|
|
#define FIND_TAG 3
|
|
#define GMEM_TAG 4
|
|
#define LMEM_TAG 5
|
|
#define ENV_TAG 6
|
|
#define RES_TAG 7
|
|
#define VDM_TAG 8
|
|
|
|
|
|
#include <vdmapi.h>
|
|
#include "vdm.h"
|
|
#include "basevdm.h"
|
|
|
|
#include "stdlib.h" // for atol
|
|
#include "stdio.h" // for atol
|
|
|
|
#include <objidl.h> // needs nturtl.h
|
|
#include <propset.h> // needs objidl.h
|
|
#include <tsappcmp.h>
|
|
|
|
//
|
|
// Hydra function for supporting beeps on remote sessions
|
|
//
|
|
typedef HANDLE (WINAPI * PWINSTATIONBEEPOPEN)(ULONG);
|
|
HANDLE WINAPI
|
|
_WinStationBeepOpen(
|
|
ULONG SessionId
|
|
);
|
|
PWINSTATIONBEEPOPEN pWinStationBeepOpen;
|
|
|
|
//
|
|
// Private functions for communication with CSR.
|
|
//
|
|
VOID
|
|
CsrBasepSoundSentryNotification(
|
|
ULONG VideoMode
|
|
);
|
|
|
|
NTSTATUS
|
|
CsrBaseClientConnectToServer(
|
|
PWSTR szSessionDir,
|
|
PHANDLE phMutant,
|
|
PBOOLEAN pServerProcess
|
|
);
|
|
|
|
NTSTATUS
|
|
CsrBasepRefreshIniFileMapping(
|
|
PUNICODE_STRING BaseFileName
|
|
);
|
|
|
|
NTSTATUS
|
|
CsrBasepDefineDosDevice(
|
|
DWORD dwFlags,
|
|
PUNICODE_STRING pDeviceName,
|
|
PUNICODE_STRING pTargetPath
|
|
);
|
|
|
|
UINT
|
|
CsrBasepGetTempFile(
|
|
VOID
|
|
);
|
|
|
|
NTSTATUS
|
|
CsrBasepCreateProcess(
|
|
PBASE_CREATEPROCESS_MSG a
|
|
);
|
|
|
|
VOID
|
|
CsrBasepExitProcess(
|
|
UINT uExitCode
|
|
);
|
|
|
|
NTSTATUS
|
|
CsrBasepSetProcessShutdownParam(
|
|
DWORD dwLevel,
|
|
DWORD dwFlags
|
|
);
|
|
|
|
NTSTATUS
|
|
CsrBasepGetProcessShutdownParam(
|
|
LPDWORD lpdwLevel,
|
|
LPDWORD lpdwFlags
|
|
);
|
|
|
|
NTSTATUS
|
|
CsrBasepSetTermsrvAppInstallMode(
|
|
BOOL bState
|
|
);
|
|
|
|
NTSTATUS
|
|
CsrBasepSetClientTimeZoneInformation(
|
|
IN PBASE_SET_TERMSRVCLIENTTIMEZONE c
|
|
);
|
|
|
|
NTSTATUS
|
|
CsrBasepCreateThread(
|
|
HANDLE ThreadHandle,
|
|
CLIENT_ID ClientId
|
|
);
|
|
|
|
//
|
|
// This should be merged with BasepCreateActCtx, its only caller.
|
|
//
|
|
#define BASEP_CREATE_ACTCTX_FLAG_NO_ADMIN_OVERRIDE 0x00000001
|
|
NTSTATUS
|
|
BasepCreateActCtx(
|
|
ULONG Flags,
|
|
IN PCACTCTXW ActParams,
|
|
OUT PVOID* ActivationContextData
|
|
);
|
|
|
|
NTSTATUS
|
|
CsrBasepCreateActCtx(
|
|
IN PBASE_SXS_CREATE_ACTIVATION_CONTEXT_MSG Message
|
|
);
|
|
|
|
#if defined(BUILD_WOW6432)
|
|
#include "ntwow64b.h"
|
|
#endif
|
|
|
|
BOOL TermsrvSyncUserIniFile(PINIFILE_PARAMETERS a);
|
|
|
|
BOOL TermsrvLogInstallIniFile(PINIFILE_PARAMETERS a);
|
|
|
|
PTERMSRVFORMATOBJECTNAME gpTermsrvFormatObjectName;
|
|
|
|
PTERMSRVGETCOMPUTERNAME gpTermsrvGetComputerName;
|
|
|
|
PTERMSRVADJUSTPHYMEMLIMITS gpTermsrvAdjustPhyMemLimits;
|
|
|
|
PTERMSRVGETWINDOWSDIRECTORYA gpTermsrvGetWindowsDirectoryA;
|
|
|
|
PTERMSRVGETWINDOWSDIRECTORYW gpTermsrvGetWindowsDirectoryW;
|
|
|
|
PTERMSRVCONVERTSYSROOTTOUSERDIR gpTermsrvConvertSysRootToUserDir;
|
|
|
|
PTERMSRVBUILDINIFILENAME gpTermsrvBuildIniFileName;
|
|
|
|
PTERMSRVCORINIFILE gpTermsrvCORIniFile;
|
|
|
|
PTERMSRVUPDATEALLUSERMENU gpTermsrvUpdateAllUserMenu;
|
|
|
|
PGETTERMSRCOMPATFLAGS gpGetTermsrCompatFlags;
|
|
|
|
PTERMSRVBUILDSYSINIPATH gpTermsrvBuildSysIniPath;
|
|
|
|
PTERMSRVCOPYINIFILE gpTermsrvCopyIniFile;
|
|
|
|
PTERMSRVGETSTRING gpTermsrvGetString;
|
|
|
|
PTERMSRVLOGINSTALLINIFILE gpTermsrvLogInstallIniFile;
|
|
|
|
//
|
|
// For periodic timers that fire APCs set when a non-default activation context is active
|
|
// we leak this structure.
|
|
//
|
|
|
|
#define BASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK_FLAG_DO_NOT_FREE_AFTER_CALLBACK (0x00000001)
|
|
|
|
typedef struct _BASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK {
|
|
DWORD Flags;
|
|
PVOID CallbackFunction;
|
|
PVOID CallbackContext;
|
|
PACTIVATION_CONTEXT ActivationContext;
|
|
} BASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK, *PBASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK;
|
|
|
|
#define BASEP_ALLOCATE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK_FLAG_DO_NOT_FREE_AFTER_CALLBACK (0x00000001)
|
|
#define BASEP_ALLOCATE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK_FLAG_DO_NOT_ALLOCATE_IF_PROCESS_DEFAULT (0x00000002)
|
|
|
|
NTSTATUS
|
|
BasepAllocateActivationContextActivationBlock(
|
|
IN DWORD Flags,
|
|
IN PVOID CallbackFunction,
|
|
IN PVOID CallbackContext,
|
|
OUT PBASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK *ActivationBlock
|
|
);
|
|
|
|
VOID
|
|
BasepFreeActivationContextActivationBlock(
|
|
IN PBASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK ActivationBlock
|
|
);
|
|
|
|
VOID
|
|
WINAPI
|
|
BasepActivationContextActivationIoCompletion(
|
|
IN PVOID ApcContext, // actually PBASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK
|
|
PIO_STATUS_BLOCK IoStatusBlock,
|
|
DWORD Reserved
|
|
);
|
|
|
|
VOID
|
|
CALLBACK
|
|
BasepTimerAPCProc(
|
|
IN PVOID ApcContext, // actually PBASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK
|
|
IN ULONG TimerLowValue,
|
|
IN LONG TimerHighValue
|
|
);
|
|
|
|
#define BASE_FILE_PATH_ISOLATION_ALLOCATE_PATH (0x00000001)
|
|
|
|
NTSTATUS
|
|
BasepApplyFilePathIsolationRedirection(
|
|
IN DWORD Flags,
|
|
IN PCUNICODE_STRING FileName,
|
|
IN OUT PUNICODE_STRING FullyQualifiedPath
|
|
);
|
|
|
|
#define SXS_POLICY_SUFFIX L".Config"
|
|
#define SXS_MANIFEST_SUFFIX L".Manifest"
|
|
extern const UNICODE_STRING SxsPolicySuffix;
|
|
|
|
typedef struct _SXS_CONSTANT_WIN32_NT_PATH_PAIR
|
|
{
|
|
PCUNICODE_STRING Win32;
|
|
PCUNICODE_STRING Nt;
|
|
} SXS_CONSTANT_WIN32_NT_PATH_PAIR;
|
|
typedef SXS_CONSTANT_WIN32_NT_PATH_PAIR* PSXS_CONSTANT_WIN32_NT_PATH_PAIR;
|
|
typedef CONST SXS_CONSTANT_WIN32_NT_PATH_PAIR* PCSXS_CONSTANT_WIN32_NT_PATH_PAIR;
|
|
|
|
typedef struct _SXS_WIN32_NT_PATH_PAIR
|
|
{
|
|
PRTL_UNICODE_STRING_BUFFER Win32;
|
|
PRTL_UNICODE_STRING_BUFFER Nt;
|
|
} SXS_WIN32_NT_PATH_PAIR;
|
|
typedef SXS_WIN32_NT_PATH_PAIR* PSXS_WIN32_NT_PATH_PAIR;
|
|
typedef CONST SXS_WIN32_NT_PATH_PAIR* PCSXS_WIN32_NT_PATH_PAIR;
|
|
|
|
NTSTATUS
|
|
BasepSxsCreateResourceStream(
|
|
IN ULONG LdrCreateOutOfProcessImageFlags,
|
|
PCSXS_CONSTANT_WIN32_NT_PATH_PAIR Win32NtPathPair,
|
|
IN OUT PBASE_MSG_SXS_HANDLES Handles,
|
|
IN ULONG_PTR MappedResourceName,
|
|
OUT PBASE_MSG_SXS_STREAM MessageStream
|
|
);
|
|
|
|
NTSTATUS
|
|
BasepSxsCreateFileStream(
|
|
IN ACCESS_MASK AccessMask,
|
|
PCSXS_CONSTANT_WIN32_NT_PATH_PAIR Win32NtPathPair,
|
|
IN OUT PBASE_MSG_SXS_HANDLES Handles,
|
|
OUT PBASE_MSG_SXS_STREAM MessageStream
|
|
);
|
|
|
|
// Pass the address of this to force policy to be empty.
|
|
// It doesn't have a special address, just the right values.
|
|
extern const SXS_OVERRIDE_STREAM SxsForceEmptyPolicy;
|
|
|
|
VOID
|
|
BasepSxsOverrideStreamToMessageStream(
|
|
IN PCSXS_OVERRIDE_STREAM OverrideStream,
|
|
OUT PBASE_MSG_SXS_STREAM MessageStream
|
|
);
|
|
|
|
#define BASEP_SXS_CREATESTREAMS_FLAG_LIKE_CREATEPROCESS 0x00000001
|
|
|
|
NTSTATUS
|
|
BasepSxsCreateStreams(
|
|
IN ULONG Flags,
|
|
IN ULONG LdrCreateOutOfProcessImageFlags,
|
|
IN ACCESS_MASK AccessMask,
|
|
IN PCSXS_OVERRIDE_STREAM OverrideManifest OPTIONAL,
|
|
IN PCSXS_OVERRIDE_STREAM OverridePolicy OPTIONAL,
|
|
IN PCSXS_CONSTANT_WIN32_NT_PATH_PAIR ManifestFilePathPair,
|
|
IN OUT PBASE_MSG_SXS_HANDLES ManifestFileHandles,
|
|
IN PCSXS_CONSTANT_WIN32_NT_PATH_PAIR ManifestImagePathPair,
|
|
IN OUT PBASE_MSG_SXS_HANDLES ManifestImageHandles,
|
|
// If none of the optional parameters are passed, then you could have directly
|
|
// called a simpler function.
|
|
IN ULONG_PTR MappedManifestResourceName OPTIONAL,
|
|
IN PCSXS_CONSTANT_WIN32_NT_PATH_PAIR PolicyPathPair OPTIONAL,
|
|
IN OUT PBASE_MSG_SXS_HANDLES PolicyHandles OPTIONAL,
|
|
OUT PULONG MessageFlags,
|
|
OUT PBASE_MSG_SXS_STREAM ManifestMessageStream,
|
|
OUT PBASE_MSG_SXS_STREAM PolicyMessageStream OPTIONAL
|
|
);
|
|
|
|
BOOL
|
|
BasepSxsIsStatusFileNotFoundEtc(
|
|
NTSTATUS Status
|
|
);
|
|
|
|
BOOL
|
|
BasepSxsIsStatusResourceNotFound(
|
|
NTSTATUS Status
|
|
);
|
|
|
|
NTSTATUS
|
|
BasepSxsCreateProcessCsrMessage(
|
|
IN PCSXS_OVERRIDE_STREAM OverrideManifest OPTIONAL,
|
|
IN PCSXS_OVERRIDE_STREAM OverridePolicy OPTIONAL,
|
|
IN OUT PCSXS_WIN32_NT_PATH_PAIR ManifestFilePathPair,
|
|
IN OUT PBASE_MSG_SXS_HANDLES ManifestFileHandles,
|
|
IN PCSXS_CONSTANT_WIN32_NT_PATH_PAIR ManifestImagePathPair,
|
|
IN OUT PBASE_MSG_SXS_HANDLES ManifestImageHandles,
|
|
IN OUT PCSXS_WIN32_NT_PATH_PAIR PolicyPathPair,
|
|
IN OUT PBASE_MSG_SXS_HANDLES PolicyHandles,
|
|
IN OUT PRTL_UNICODE_STRING_BUFFER Win32AssemblyDirectoryBuffer,
|
|
OUT PBASE_SXS_CREATEPROCESS_MSG Message
|
|
);
|
|
|
|
NTSTATUS
|
|
BasepSxsGetProcessImageBaseAddress(
|
|
HANDLE Process,
|
|
PVOID* ImageBaseAddress
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
BasepSxsActivationContextNotification(
|
|
IN ULONG NotificationType,
|
|
IN PACTIVATION_CONTEXT ActivationContext,
|
|
IN const VOID *ActivationContextData,
|
|
IN PVOID NotificationContext,
|
|
IN PVOID NotificationData,
|
|
IN OUT PBOOLEAN DisableNotification
|
|
);
|
|
|
|
VOID
|
|
BasepSxsDbgPrintMessageStream(
|
|
PCSTR Function,
|
|
PCSTR StreamName,
|
|
PBASE_MSG_SXS_STREAM MessageStream
|
|
);
|
|
|
|
extern const UNICODE_STRING SxsManifestSuffix;
|
|
extern const UNICODE_STRING SxsPolicySuffix;
|
|
|
|
VOID
|
|
BasepSxsCloseHandles(
|
|
IN PCBASE_MSG_SXS_HANDLES Handles
|
|
);
|
|
|
|
extern const WCHAR AdvapiDllString[];
|
|
|
|
//
|
|
// These functions implement apphelp cache functionality (ahcache.c)
|
|
//
|
|
|
|
//
|
|
// Routines in ahcache.c
|
|
//
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
BaseCheckAppcompatCache(
|
|
LPCWSTR pwszPath,
|
|
HANDLE hFile,
|
|
PVOID pEnvironment,
|
|
DWORD* dwReason
|
|
);
|
|
|
|
//
|
|
// function that we call from winlogon
|
|
//
|
|
|
|
BOOL
|
|
WINAPI
|
|
BaseInitAppcompatCacheSupport(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
WINAPI
|
|
BaseCleanupAppcompatCache(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
WINAPI
|
|
BaseCleanupAppcompatCacheSupport(
|
|
BOOL bWrite
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
BasepProbeForDllManifest(
|
|
IN PVOID DllBase,
|
|
IN PCWSTR FullDllPath,
|
|
OUT PVOID *ActivationContext
|
|
);
|
|
|
|
#define BASEP_GET_MODULE_HANDLE_EX_NO_LOCK (0x00000001)
|
|
BOOL
|
|
BasepGetModuleHandleExW(
|
|
IN DWORD dwPrivateFlags,
|
|
IN DWORD dwPublicFlags,
|
|
IN LPCWSTR lpModuleName,
|
|
OUT HMODULE* phModule
|
|
);
|
|
|
|
#define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_ERROR 1
|
|
#define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_SUCCESS 2
|
|
#define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_CONTINUE 3
|
|
ULONG
|
|
BasepGetModuleHandleExParameterValidation(
|
|
IN DWORD dwFlags,
|
|
IN CONST VOID* lpModuleName,
|
|
OUT HMODULE* phModule
|
|
);
|
|
|
|
#define BASEP_GET_TEMP_PATH_PRESERVE_TEB (0x00000001)
|
|
DWORD
|
|
BasepGetTempPathW(
|
|
ULONG Flags,
|
|
DWORD nBufferLength,
|
|
LPWSTR lpBuffer
|
|
);
|
|
|
|
#endif // _BASEP_
|