} DEBUG_OBJECT_KILL_PROCESS_ON_EXIT_INFORMATION, *
PDEBUG_OBJECT_KILL_PROCESS_ON_EXIT_INFORMATION;
+#ifndef NTOS_MODE_USER
typedef struct _DBGK_DEBUG_OBJECT
{
KEVENT Event;
ULONG Flags;
struct
{
- UCHAR DebuggerInactive :1;
- UCHAR KillProcessOnExit :1;
+ UCHAR DebuggerInactive:1;
+ UCHAR KillProcessOnExit:1;
};
};
} DBGK_DEBUG_OBJECT, *PDBGK_DEBUG_OBJECT;
+#endif
typedef enum _DBG_STATE
{
} StateInfo;
} DBGUI_WAIT_STATE_CHANGE, *PDBGUI_WAIT_STATE_CHANGE;
+typedef struct _DBGKM_MSG
+{
+ PORT_MESSAGE h;
+ ULONG Opcode;
+ ULONG Status;
+ union
+ {
+ DBGKM_EXCEPTION Exception;
+ DBGKM_CREATE_THREAD CreateThread;
+ DBGKM_CREATE_PROCESS CreateProcess;
+ DBGKM_EXIT_THREAD ExitThread;
+ DBGKM_EXIT_PROCESS ExitProcess;
+ DBGKM_LOAD_DLL LoadDll;
+ DBGKM_UNLOAD_DLL UnloadDll;
+ };
+} DBGKM_MSG, *PDBGKM_MSG;
+
#endif
#define SEMAPHORE_QUERY_STATE 0x0001
#endif
+#define MAXIMUM_HARDERROR_PARAMETERS 4
+
/* ENUMERATIONS **************************************************************/
/* TYPES *********************************************************************/
} LPCP_CONNECTION_MESSAGE, *PLPCP_CONNECTION_MESSAGE;
#endif
+typedef struct _HARDERROR_MSG
+{
+ PORT_MESSAGE h;
+ NTSTATUS Status;
+ LARGE_INTEGER ErrorTime;
+ ULONG ValidResponseOptions;
+ ULONG Response;
+ ULONG NumberOfParameters;
+ ULONG UnicodeStringParameterMask;
+ ULONG Parameters[MAXIMUM_HARDERROR_PARAMETERS];
+} HARDERROR_MSG, *PHARDERROR_MSG;
+
+typedef struct _CLIENT_DIED_MSG
+{
+ PORT_MESSAGE h;
+ LARGE_INTEGER CreateTime;
+} CLIENT_DIED_MSG, *PCLIENT_DIED_MSG;
+
/* CONSTANTS *****************************************************************/
#define PORT_MAXIMUM_MESSAGE_LENGTH 256
/* EXPORTED DATA *************************************************************/
/* CONSTANTS *****************************************************************/
+#ifdef NTOS_MODE_USER
+#define SEC_BASED 0x00200000
+#define SEC_NO_CHANGE 0x00400000
+#endif
/* ENUMERATIONS **************************************************************/
#include "kdfuncs.h" /* Kernel Debugger Functions */
#include "cctypes.h" /* Cache Manager Types */
#include "potypes.h" /* Power Manager Types */
-#include "dbgktypes.h" /* User-Mode Kernel Debugging Types */
#include "haltypes.h" /* Hardware Abstraction Layer Types */
#include "halfuncs.h" /* Hardware Abstraction Layer Functions */
#include "inbvfuncs.h" /* Initialization Boot Video Functions */
#include "mmfuncs.h" /* Memory Manager Functions */
#include "obfuncs.h" /* Object Manager Functions */
#include "psfuncs.h" /* Process Manager Functions */
-#include "setypes.h" /* Security Subsystem Types */
#include "sefuncs.h" /* Security Subsystem Functions */
#endif /* !NTOS_MODE_USER */
#include "obtypes.h" /* Object Manager Types */
#include "pstypes.h" /* Process Manager Types */
#include "lpctypes.h" /* Local Procedure Call Types */
+#include "dbgktypes.h" /* User-Mode Kernel Debugging Types */
#include "zwtypes.h" /* Native Types */
#include "zwfuncs.h" /* Native Functions (System Calls) */
#include "rtltypes.h" /* Runtime Library Types */
#include "rtlfuncs.h" /* Runtime Library Functions */
+#include "setypes.h" /* Security Subsystem Types */
#include "umfuncs.h" /* User-Mode NT Library Functions */
#include "i386/floatsave.h" /* Floating Point Save Area Definitions for i386 */
#include "i386/segment.h" /* Kernel CPU Segment Definitions for i386 */
STDCALL
RtlRaiseStatus(NTSTATUS Status);
+LONG
+STDCALL
+RtlUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo);
+
VOID
STDCALL
RtlUnwind(
BOOLEAN Failure
);
+NTSTATUS
+STDCALL
+RtlAdjustPrivilege(
+ IN ULONG Privilege,
+ IN BOOLEAN NewValue,
+ IN BOOLEAN ForThread,
+ OUT PBOOLEAN OldValue
+);
+
NTSTATUS
STDCALL
RtlAllocateAndInitializeSid(
sizeof(__SOURCE_STRING__), \
(__SOURCE_STRING__) \
}
+
+#define RtlEqualLuid(L1, L2) (((L1)->HighPart == (L2)->HighPart) && \
+ ((L1)->LowPart == (L2)->LowPart))
#endif
/* FIXME: Rename these */
/* EXPORTED DATA *************************************************************/
/* CONSTANTS *****************************************************************/
+#ifdef NTOS_MODE_USER
+#define SE_MIN_WELL_KNOWN_PRIVILEGE (2L)
+#define SE_CREATE_TOKEN_PRIVILEGE (2L)
+#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE (3L)
+#define SE_LOCK_MEMORY_PRIVILEGE (4L)
+#define SE_INCREASE_QUOTA_PRIVILEGE (5L)
+#define SE_UNSOLICITED_INPUT_PRIVILEGE (6L)
+#define SE_MACHINE_ACCOUNT_PRIVILEGE (6L)
+#define SE_TCB_PRIVILEGE (7L)
+#define SE_SECURITY_PRIVILEGE (8L)
+#define SE_TAKE_OWNERSHIP_PRIVILEGE (9L)
+#define SE_LOAD_DRIVER_PRIVILEGE (10L)
+#define SE_SYSTEM_PROFILE_PRIVILEGE (11L)
+#define SE_SYSTEMTIME_PRIVILEGE (12L)
+#define SE_PROF_SINGLE_PROCESS_PRIVILEGE (13L)
+#define SE_INC_BASE_PRIORITY_PRIVILEGE (14L)
+#define SE_CREATE_PAGEFILE_PRIVILEGE (15L)
+#define SE_CREATE_PERMANENT_PRIVILEGE (16L)
+#define SE_BACKUP_PRIVILEGE (17L)
+#define SE_RESTORE_PRIVILEGE (18L)
+#define SE_SHUTDOWN_PRIVILEGE (19L)
+#define SE_DEBUG_PRIVILEGE (20L)
+#define SE_AUDIT_PRIVILEGE (21L)
+#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE (22L)
+#define SE_CHANGE_NOTIFY_PRIVILEGE (23L)
+#define SE_REMOTE_SHUTDOWN_PRIVILEGE (24L)
+#define SE_MAX_WELL_KNOWN_PRIVILEGE (SE_REMOTE_SHUTDOWN_PRIVILEGE)
+#endif
/* ENUMERATIONS **************************************************************/
/* TYPES *********************************************************************/
+#ifndef NTOS_MODE_USER
typedef struct _SEP_AUDIT_POLICY_CATEGORIES
{
UCHAR System:4;
} SE_AUDIT_PROCESS_CREATION_INFO, *PSE_AUDIT_PROCESS_CREATION_INFO;
#endif
+#endif
NTSTATUS
STDCALL
LdrGetDllHandle(
- IN PWCHAR Path OPTIONAL,
- IN ULONG Unknown2,
+ IN PWSTR DllPath OPTIONAL,
+ IN PULONG DllCharacteristics,
IN PUNICODE_STRING DllName,
- OUT PVOID *BaseAddress
+ OUT PVOID *DllHandle
);
NTSTATUS
STDCALL
NtAcceptConnectPort(
PHANDLE PortHandle,
- HANDLE NamedPortHandle,
- PPORT_MESSAGE ServerReply,
- BOOLEAN AcceptIt,
- PPORT_VIEW WriteMap,
- PREMOTE_PORT_VIEW ReadMap
+ PVOID PortContext OPTIONAL,
+ PPORT_MESSAGE ConnectionRequest,
+ BOOLEAN AcceptConnection,
+ PPORT_VIEW ServerView OPTIONAL,
+ PREMOTE_PORT_VIEW ClientView OPTIONAL
+);
+
+NTSTATUS
+STDCALL
+ZwAcceptConnectPort(
+ PHANDLE PortHandle,
+ PVOID PortContext OPTIONAL,
+ PPORT_MESSAGE ConnectionRequest,
+ BOOLEAN AcceptConnection,
+ PPORT_VIEW ServerView OPTIONAL,
+ PREMOTE_PORT_VIEW ClientView OPTIONAL
);
NTSTATUS
PHANDLE PortHandle,
PUNICODE_STRING PortName,
PSECURITY_QUALITY_OF_SERVICE SecurityQos,
- PPORT_VIEW SectionInfo,
- PREMOTE_PORT_VIEW MapInfo,
- PULONG MaxMessageSize,
- PVOID ConnectInfo,
- PULONG ConnectInfoLength
+ PPORT_VIEW ClientView OPTIONAL,
+ PREMOTE_PORT_VIEW ServerView OPTIONAL,
+ PULONG MaxMessageLength OPTIONAL,
+ PVOID ConnectionInformation OPTIONAL,
+ PULONG ConnectionInformationLength OPTIONAL
);
NTSTATUS
PHANDLE PortHandle,
PUNICODE_STRING PortName,
PSECURITY_QUALITY_OF_SERVICE SecurityQos,
- PPORT_VIEW SectionInfo,
- PREMOTE_PORT_VIEW MapInfo,
- PULONG MaxMessageSize,
- PVOID ConnectInfo,
- PULONG ConnectInfoLength
+ PPORT_VIEW ClientView OPTIONAL,
+ PREMOTE_PORT_VIEW ServerView OPTIONAL,
+ PULONG MaxMessageLength OPTIONAL,
+ PVOID ConnectionInformation OPTIONAL,
+ PULONG ConnectionInformationLength OPTIONAL
);
NTSTATUS
NtCreatePort(
PHANDLE PortHandle,
POBJECT_ATTRIBUTES ObjectAttributes,
- ULONG MaxConnectInfoLength,
- ULONG MaxDataLength,
- ULONG NPMessageQueueSize OPTIONAL
+ ULONG MaxConnectionInfoLength,
+ ULONG MaxMessageLength,
+ ULONG MaxPoolUsage
);
NTSTATUS
STDCALL
-NtCreatePort(
+ZwCreatePort(
PHANDLE PortHandle,
POBJECT_ATTRIBUTES ObjectAttributes,
- ULONG MaxConnectInfoLength,
- ULONG MaxDataLength,
- ULONG NPMessageQueueSize OPTIONAL
+ ULONG MaxConnectionInfoLength,
+ ULONG MaxMessageLength,
+ ULONG MaxPoolUsage
);
NTSTATUS
NTSTATUS
STDCALL
NtListenPort(HANDLE PortHandle,
- PPORT_MESSAGE LpcMessage
+ PPORT_MESSAGE ConnectionRequest
);
NTSTATUS
STDCALL
ZwListenPort(HANDLE PortHandle,
- PPORT_MESSAGE LpcMessage
+ PPORT_MESSAGE ConnectionRequest
);
NTSTATUS
NtRaiseHardError(
IN NTSTATUS ErrorStatus,
IN ULONG NumberOfParameters,
- IN PUNICODE_STRING UnicodeStringParameterMask OPTIONAL,
- IN PVOID *Parameters,
- IN HARDERROR_RESPONSE_OPTION ResponseOption,
- OUT PHARDERROR_RESPONSE Response
-);
+ IN ULONG UnicodeStringParameterMask,
+ IN PULONG_PTR Parameters,
+ IN ULONG ValidResponseOptions,
+ OUT PULONG Response
+);
NTSTATUS
STDCALL
STDCALL
NtReplyWaitReceivePort(
HANDLE PortHandle,
- PULONG PortId,
- PPORT_MESSAGE MessageReply,
- PPORT_MESSAGE MessageRequest
+ PVOID *PortContext OPTIONAL,
+ PPORT_MESSAGE ReplyMessage OPTIONAL,
+ PPORT_MESSAGE ReceiveMessage
);
NTSTATUS
STDCALL
ZwReplyWaitReceivePort(
HANDLE PortHandle,
- PULONG PortId,
- PPORT_MESSAGE MessageReply,
- PPORT_MESSAGE MessageRequest
+ PVOID *PortContext OPTIONAL,
+ PPORT_MESSAGE ReplyMessage,
+ PPORT_MESSAGE ReceiveMessage
);
NTSTATUS
* @implemented
*/
NTSTATUS STDCALL
-LdrGetDllHandle(IN PWCHAR Path OPTIONAL,
- IN ULONG Unknown2,
+LdrGetDllHandle(IN PWSTR DllPath OPTIONAL,
+ IN PULONG DllCharacteristics,
IN PUNICODE_STRING DllName,
- OUT PVOID* BaseAddress)
+ OUT PVOID *DllHandle)
{
PLDR_DATA_TABLE_ENTRY Module;
NTSTATUS Status;
- TRACE_LDR("LdrGetDllHandle, searching for %wZ from %S\n", DllName, Path ? Path : L"");
+ TRACE_LDR("LdrGetDllHandle, searching for %wZ from %S\n",
+ DllName, DllPath ? DllPath : L"");
/* NULL is the current executable */
if (DllName == NULL)
{
- *BaseAddress = ExeModule->DllBase;
- DPRINT("BaseAddress %x\n", *BaseAddress);
+ *DllHandle = ExeModule->DllBase;
+ DPRINT("BaseAddress %x\n", *DllHandle);
return STATUS_SUCCESS;
}
Status = LdrFindEntryForName(DllName, &Module, FALSE);
if (NT_SUCCESS(Status))
{
- *BaseAddress = Module->DllBase;
+ *DllHandle = Module->DllBase;
return STATUS_SUCCESS;
}
DPRINT("Failed to find dll %wZ\n", DllName);
- *BaseAddress = NULL;
+ *DllHandle = NULL;
return STATUS_DLL_NOT_FOUND;
}
STDCALL
ExRaiseHardError(IN NTSTATUS ErrorStatus,
IN ULONG NumberOfParameters,
- IN PUNICODE_STRING UnicodeStringParameterMask OPTIONAL,
- IN PVOID *Parameters,
- IN HARDERROR_RESPONSE_OPTION ResponseOption,
- OUT PHARDERROR_RESPONSE Response)
+ IN ULONG UnicodeStringParameterMask,
+ IN PULONG_PTR Parameters,
+ IN ULONG ValidResponseOptions,
+ OUT PULONG Response)
{
UNIMPLEMENTED;
}
STDCALL
NtRaiseHardError(IN NTSTATUS ErrorStatus,
IN ULONG NumberOfParameters,
- IN PUNICODE_STRING UnicodeStringParameterMask OPTIONAL,
- IN PVOID *Parameters,
- IN HARDERROR_RESPONSE_OPTION ResponseOption,
- OUT PHARDERROR_RESPONSE Response)
+ IN ULONG UnicodeStringParameterMask,
+ IN PULONG_PTR Parameters,
+ IN ULONG ValidResponseOptions,
+ OUT PULONG Response)
{
DPRINT1("Hard error %x\n", ErrorStatus);
NumberOfParameters,
UnicodeStringParameterMask,
Parameters,
- ResponseOption,
+ ValidResponseOptions,
Response);
/* Return Success */
PORT_MESSAGE Message;
} QUEUEDMESSAGE, *PQUEUEDMESSAGE;
-typedef struct _LPC_DBG_MESSAGE
-{
- PORT_MESSAGE Header;
- ULONG Type;
- ULONG Status;
- union
- {
- struct
- {
- EXCEPTION_RECORD ExceptionRecord;
- ULONG FirstChance;
- } Exception;
- struct
- {
- ULONG Reserved;
- PVOID StartAddress;
- } CreateThread;
- struct
- {
- ULONG Reserved;
- HANDLE FileHandle;
- PVOID Base;
- ULONG PointerToSymbolTable;
- ULONG NumberOfSymbols;
- ULONG Reserved2;
- PVOID EntryPoint;
- } CreateProcess;
- struct
- {
- ULONG ExitCode;
- } ExitThread;
- struct
- {
- ULONG ExitCode;
- } ExitProcess;
- struct
- {
- HANDLE FileHandle;
- PVOID Base;
- ULONG PointerToSymbolTable;
- ULONG NumberOfSymbols;
- } LoadDll;
- struct
- {
- PVOID Base;
- } UnloadDll;
- } Data;
-} LPC_DBG_MESSAGE, *PLPC_DBG_MESSAGE;
-
-typedef struct _LPC_TERMINATION_MESSAGE
-{
- PORT_MESSAGE Header;
- LARGE_INTEGER CreationTime;
-} LPC_TERMINATION_MESSAGE, *PLPC_TERMINATION_MESSAGE;
-
/* Code in ntoskrnl/lpc/close.h */
VOID STDCALL
* REVISIONS
*/
NTSTATUS STDCALL
-NtReplyWaitReceivePortEx(IN HANDLE PortHandle,
- OUT PULONG PortId,
- IN PPORT_MESSAGE LpcReply,
- OUT PPORT_MESSAGE LpcMessage,
- IN PLARGE_INTEGER Timeout)
+NtReplyWaitReceivePortEx(IN HANDLE PortHandle,
+ OUT PVOID *PortContext OPTIONAL,
+ IN PPORT_MESSAGE ReplyMessage OPTIONAL,
+ OUT PPORT_MESSAGE ReceiveMessage,
+ IN PLARGE_INTEGER Timeout OPTIONAL)
{
PEPORT Port;
KIRQL oldIrql;
{
_SEH_TRY
{
- ProbeForWrite(LpcMessage,
+ ProbeForWrite(ReceiveMessage,
sizeof(PORT_MESSAGE),
1);
}
/*
* Send the reply, only if port is connected
*/
- if (LpcReply != NULL && !Disconnected)
+ if (ReplyMessage != NULL && !Disconnected)
{
Status = EiReplyOrRequestPort(Port->OtherPort,
- LpcReply,
+ ReplyMessage,
LPC_REPLY,
Port);
KeReleaseSemaphore(&Port->OtherPort->Semaphore, IO_NO_INCREMENT, 1,
{
_SEH_TRY
{
- ProbeForWrite((PVOID)(LpcMessage + 1),
+ ProbeForWrite((PVOID)(ReceiveMessage + 1),
CRequest->ConnectDataLength,
1);
- RtlCopyMemory(LpcMessage,
+ RtlCopyMemory(ReceiveMessage,
&Header,
sizeof(PORT_MESSAGE));
- RtlCopyMemory((PVOID)(LpcMessage + 1),
+ RtlCopyMemory((PVOID)(ReceiveMessage + 1),
CRequest->ConnectData,
CRequest->ConnectDataLength);
}
}
else
{
- RtlCopyMemory(LpcMessage,
+ RtlCopyMemory(ReceiveMessage,
&Header,
sizeof(PORT_MESSAGE));
- RtlCopyMemory((PVOID)(LpcMessage + 1),
+ RtlCopyMemory((PVOID)(ReceiveMessage + 1),
CRequest->ConnectData,
CRequest->ConnectDataLength);
}
{
_SEH_TRY
{
- ProbeForWrite(LpcMessage,
+ ProbeForWrite(ReceiveMessage,
Request->Message.u1.s1.TotalLength,
1);
- RtlCopyMemory(LpcMessage,
+ RtlCopyMemory(ReceiveMessage,
&Request->Message,
Request->Message.u1.s1.TotalLength);
}
}
else
{
- RtlCopyMemory(LpcMessage,
+ RtlCopyMemory(ReceiveMessage,
&Request->Message,
Request->Message.u1.s1.TotalLength);
}
* REVISIONS
*/
NTSTATUS STDCALL
-NtReplyWaitReceivePort (IN HANDLE PortHandle,
- OUT PULONG PortId,
- IN PPORT_MESSAGE LpcReply,
- OUT PPORT_MESSAGE LpcMessage)
+NtReplyWaitReceivePort(IN HANDLE PortHandle,
+ OUT PVOID *PortContext OPTIONAL,
+ IN PPORT_MESSAGE ReplyMessage OPTIONAL,
+ OUT PPORT_MESSAGE ReceiveMessage)
{
- return(NtReplyWaitReceivePortEx (PortHandle,
- PortId,
- LpcReply,
- LpcMessage,
- NULL));
+ return NtReplyWaitReceivePortEx(PortHandle,
+ PortContext,
+ ReplyMessage,
+ ReceiveMessage,
+ NULL);
}
/**********************************************************************
*/
NTSTATUS STDCALL
LpcSendTerminationPort (IN PEPORT Port,
- IN LARGE_INTEGER CreationTime)
+ IN LARGE_INTEGER CreateTime)
{
NTSTATUS Status;
- LPC_TERMINATION_MESSAGE Msg;
+ CLIENT_DIED_MSG Msg;
#ifdef __USE_NT_LPC__
- Msg.Header.u2.s2.Type = LPC_NEW_MESSAGE;
+ Msg.h.u2.s2.Type = LPC_CLIENT_DIED;
#endif
- Msg.CreationTime = CreationTime;
- Status = LpcRequestPort (Port, &Msg.Header);
+ Msg.CreateTime = CreateTime;
+ Status = LpcRequestPort (Port, &Msg.h);
return(Status);
}
*/
NTSTATUS STDCALL
LpcSendDebugMessagePort (IN PEPORT Port,
- IN PLPC_DBG_MESSAGE Message,
- OUT PLPC_DBG_MESSAGE Reply)
+ IN PDBGKM_MSG Message,
+ OUT PDBGKM_MSG Reply)
{
NTSTATUS Status;
KIRQL oldIrql;
PQUEUEDMESSAGE ReplyMessage;
Status = EiReplyOrRequestPort(Port,
- &Message->Header,
+ &Message->h,
LPC_REQUEST,
Port);
if (!NT_SUCCESS(Status))
SmpApiConnectedThread(PVOID pConnectedPort)
{
NTSTATUS Status = STATUS_SUCCESS;
- PVOID Unknown = NULL;
PPORT_MESSAGE Reply = NULL;
SM_PORT_MESSAGE Request;
HANDLE ConnectedPort = * (PHANDLE) pConnectedPort;
DPRINT("SM: %s: waiting for message\n",__FUNCTION__);
Status = NtReplyWaitReceivePort(ConnectedPort,
- (PULONG) & Unknown,
+ NULL,
Reply,
(PPORT_MESSAGE) & Request);
if (NT_SUCCESS(Status))