mirror of
https://github.com/reactos/reactos.git
synced 2024-10-04 08:25:53 +00:00
[LSALIB/LSASRV]
Make the call sequence LsaRegisterLogonProcess, LsaLookupAuthenticationPackage, LsaDeregisterLogonProcess work without failures or loss of connection. WIP. svn path=/trunk/; revision=58303
This commit is contained in:
parent
7121ae2525
commit
9cdf574f39
|
@ -20,16 +20,26 @@ static HANDLE AuthPortHandle = NULL;
|
|||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
||||
static NTSTATUS
|
||||
LsapLookupAuthenticationPackage(PLSA_API_MSG RequestMsg)
|
||||
{
|
||||
RequestMsg->LookupAuthenticationPackage.Reply.Package = 0x12345678;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS WINAPI
|
||||
AuthPortThreadRoutine(PVOID Param)
|
||||
{
|
||||
LSASS_REQUEST Request;
|
||||
PPORT_MESSAGE Reply = NULL;
|
||||
PLSA_API_MSG ReplyMsg = NULL;
|
||||
LSA_API_MSG RequestMsg;
|
||||
NTSTATUS Status;
|
||||
|
||||
HANDLE ConnectionHandle = NULL;
|
||||
PVOID Context = NULL;
|
||||
BOOLEAN Accept;
|
||||
REMOTE_PORT_VIEW RemotePortView;
|
||||
|
||||
TRACE("AuthPortThreadRoutine() called\n");
|
||||
|
||||
|
@ -39,8 +49,8 @@ AuthPortThreadRoutine(PVOID Param)
|
|||
{
|
||||
Status = NtReplyWaitReceivePort(AuthPortHandle,
|
||||
0,
|
||||
Reply,
|
||||
&Request.Header);
|
||||
&ReplyMsg->h,
|
||||
&RequestMsg.h);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
TRACE("NtReplyWaitReceivePort() failed (Status %lx)\n", Status);
|
||||
|
@ -49,42 +59,62 @@ AuthPortThreadRoutine(PVOID Param)
|
|||
|
||||
TRACE("Received message\n");
|
||||
|
||||
if (Request.Header.u2.s2.Type == LPC_CONNECTION_REQUEST)
|
||||
switch (RequestMsg.h.u2.s2.Type)
|
||||
{
|
||||
TRACE("Port connection request\n");
|
||||
case LPC_CONNECTION_REQUEST:
|
||||
TRACE("Port connection request\n");
|
||||
|
||||
Accept = TRUE;
|
||||
NtAcceptConnectPort(&ConnectionHandle,
|
||||
&Context,
|
||||
&Request.Header,
|
||||
Accept,
|
||||
NULL,
|
||||
NULL);
|
||||
RemotePortView.Length = sizeof(REMOTE_PORT_VIEW);
|
||||
|
||||
Accept = TRUE;
|
||||
Status = NtAcceptConnectPort(&ConnectionHandle,
|
||||
&Context,
|
||||
&RequestMsg.h,
|
||||
Accept,
|
||||
NULL,
|
||||
&RemotePortView);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("NtAcceptConnectPort failed (Status 0x%lx)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
NtCompleteConnectPort(ConnectionHandle);
|
||||
Status = NtCompleteConnectPort(ConnectionHandle);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("NtCompleteConnectPort failed (Status 0x%lx)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
}
|
||||
else if (Request.Header.u2.s2.Type == LPC_PORT_CLOSED ||
|
||||
Request.Header.u2.s2.Type == LPC_CLIENT_DIED)
|
||||
{
|
||||
TRACE("Port closed or client died request\n");
|
||||
ReplyMsg = NULL;
|
||||
break;
|
||||
|
||||
// return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
else if (Request.Header.u2.s2.Type == LPC_REQUEST)
|
||||
{
|
||||
TRACE("Received request (Type: %lu)\n", Request.Type);
|
||||
case LPC_PORT_CLOSED:
|
||||
TRACE("Port closed\n");
|
||||
ReplyMsg = NULL;
|
||||
break;
|
||||
|
||||
}
|
||||
else if (Request.Header.u2.s2.Type == LPC_DATAGRAM)
|
||||
{
|
||||
TRACE("Received datagram\n");
|
||||
case LPC_CLIENT_DIED:
|
||||
TRACE("Client died\n");
|
||||
ReplyMsg = NULL;
|
||||
break;
|
||||
|
||||
default:
|
||||
TRACE("Received request (ApiNumber: %lu)\n", RequestMsg.ApiNumber);
|
||||
|
||||
if (RequestMsg.ApiNumber == LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE)
|
||||
{
|
||||
RequestMsg.Status = LsapLookupAuthenticationPackage(&RequestMsg);
|
||||
}
|
||||
else
|
||||
RequestMsg.Status = STATUS_SUCCESS;
|
||||
|
||||
ReplyMsg = &RequestMsg;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return Status;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
@ -107,9 +137,9 @@ StartAuthenticationPort(VOID)
|
|||
|
||||
Status = NtCreatePort(&AuthPortHandle,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
0x100,
|
||||
0x2000);
|
||||
sizeof(LSA_CONNECTION_INFO),
|
||||
sizeof(LSA_API_MSG),
|
||||
sizeof(LSA_API_MSG) * 32);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
TRACE("NtCreatePort() failed (Status %lx)\n", Status);
|
||||
|
|
|
@ -14,14 +14,19 @@
|
|||
#include <ntsecapi.h>
|
||||
|
||||
#define LSASS_MAX_LOGON_PROCESS_NAME_LENGTH 127
|
||||
#define LSASS_MAX_PACKAGE_NAME_LENGTH 127
|
||||
|
||||
#define LSASS_REQUEST_REGISTER_LOGON_PROCESS (1)
|
||||
#define LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE (2)
|
||||
#define LSASS_REQUEST_DEREGISTER_LOGON_PROCESS (3)
|
||||
#define LSASS_REQUEST_LOGON_USER (4)
|
||||
#define LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE (5)
|
||||
#define LSASS_REQUEST_MAXIMUM (6)
|
||||
typedef enum _LSA_API_NUMBER
|
||||
{
|
||||
LSASS_REQUEST_REGISTER_LOGON_PROCESS,
|
||||
LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE,
|
||||
LSASS_REQUEST_DEREGISTER_LOGON_PROCESS,
|
||||
LSASS_REQUEST_LOGON_USER,
|
||||
LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE,
|
||||
LSASS_REQUEST_MAXIMUM
|
||||
} LSA_API_NUMBER, *PLSA_API_NUMBER;
|
||||
|
||||
#if 0
|
||||
typedef struct _LSASS_LOOKUP_AUTHENTICATION_PACKAGE_REQUEST
|
||||
{
|
||||
ULONG PackageNameLength;
|
||||
|
@ -46,6 +51,7 @@ typedef struct _LSASS_DEREGISTER_LOGON_PROCESS_REPLY
|
|||
ULONG Dummy;
|
||||
} LSASS_DEREGISTER_LOGON_PROCESS_REPLY,
|
||||
*PLSASS_DEREGISTER_LOGON_PROCESS_REPLY;
|
||||
#endif
|
||||
|
||||
typedef struct _LSASS_CALL_AUTHENTICATION_PACKAGE_REQUEST
|
||||
{
|
||||
|
@ -87,6 +93,7 @@ typedef struct _LSASS_LOGON_USER_REPLY
|
|||
UCHAR Data[1];
|
||||
} LSASS_LOGON_USER_REPLY, *PLSASS_LOGON_USER_REPLY;
|
||||
|
||||
#if 0
|
||||
typedef struct _LSASS_REGISTER_LOGON_PROCESS_REQUEST
|
||||
{
|
||||
ULONG Length;
|
||||
|
@ -97,17 +104,17 @@ typedef struct _LSASS_REGISTER_LOGON_PROCESS_REPLY
|
|||
{
|
||||
LSA_OPERATIONAL_MODE OperationalMode;
|
||||
} LSASS_REGISTER_LOGON_PROCESS_REPLY, *PLSASS_REGISTER_LOGON_PROCESS_REPLY;
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct _LSASS_CONNECT_DATA
|
||||
typedef struct _LSA_CONNECTION_INFO
|
||||
{
|
||||
NTSTATUS Status;
|
||||
LSA_OPERATIONAL_MODE OperationalMode;
|
||||
ULONG Length;
|
||||
CHAR LogonProcessNameBuffer[LSASS_MAX_LOGON_PROCESS_NAME_LENGTH + 1];
|
||||
} LSASS_CONNECT_DATA, *PLSASS_CONNECT_DATA;
|
||||
|
||||
} LSA_CONNECTION_INFO, *PLSA_CONNECTION_INFO;
|
||||
|
||||
#if 0
|
||||
typedef union _LSASS_REQUEST
|
||||
{
|
||||
PORT_MESSAGE Header;
|
||||
|
@ -141,5 +148,77 @@ typedef struct _LSASS_REPLY
|
|||
LookupAuthenticationPackageReply;
|
||||
} d;
|
||||
} LSASS_REPLY, *PLSASS_REPLY;
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct _LSA_REGISTER_LOGON_PROCESS_MSG
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
ULONG Length;
|
||||
CHAR LogonProcessNameBuffer[LSASS_MAX_LOGON_PROCESS_NAME_LENGTH + 1];
|
||||
} Request;
|
||||
struct
|
||||
{
|
||||
LSA_OPERATIONAL_MODE OperationalMode;
|
||||
} Reply;
|
||||
};
|
||||
} LSA_REGISTER_LOGON_PROCESS_MSG, *PLSA_REGISTER_LOGON_PROCESS_MSG;
|
||||
|
||||
|
||||
typedef struct _LSA_DEREGISTER_LOGON_PROCESS_MSG
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
ULONG Dummy;
|
||||
} Request;
|
||||
struct
|
||||
{
|
||||
ULONG Dummy;
|
||||
} Reply;
|
||||
};
|
||||
} LSA_DEREGISTER_LOGON_PROCESS_MSG, *PLSA_DEREGISTER_LOGON_PROCESS_MSG;
|
||||
|
||||
|
||||
typedef struct _LSA_LOOKUP_AUTHENTICATION_PACKAGE_MSG
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
ULONG PackageNameLength;
|
||||
CHAR PackageName[LSASS_MAX_PACKAGE_NAME_LENGTH + 1];
|
||||
} Request;
|
||||
struct
|
||||
{
|
||||
ULONG Package;
|
||||
} Reply;
|
||||
};
|
||||
} LSA_LOOKUP_AUTHENTICATION_PACKAGE_MSG, *PLSA_LOOKUP_AUTHENTICATION_PACKAGE_MSG;
|
||||
|
||||
typedef struct _LSA_API_MSG
|
||||
{
|
||||
PORT_MESSAGE h;
|
||||
struct
|
||||
{
|
||||
LSA_API_NUMBER ApiNumber;
|
||||
NTSTATUS Status;
|
||||
union
|
||||
{
|
||||
LSA_REGISTER_LOGON_PROCESS_MSG RegisterLogonProcess;
|
||||
// LSA_LOGON_USER_MSG LogonUser;
|
||||
// LSA_CALL_AUTHENTICATION_PACKAGE_MSG CallAuthenticationPackage;
|
||||
LSA_DEREGISTER_LOGON_PROCESS_MSG DeregisterLogonProcess;
|
||||
LSA_LOOKUP_AUTHENTICATION_PACKAGE_MSG LookupAuthenticationPackage;
|
||||
};
|
||||
};
|
||||
} LSA_API_MSG, *PLSA_API_MSG;
|
||||
|
||||
#define LSA_PORT_DATA_SIZE(c) (sizeof(ULONG)+sizeof(NTSTATUS)+sizeof(c))
|
||||
#define LSA_PORT_MESSAGE_SIZE (sizeof(LSA_API_MSG))
|
||||
|
||||
#endif /* __INCLUDE_LSASS_LSASS_H */
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <ndk/lpctypes.h>
|
||||
#include <ndk/lpcfuncs.h>
|
||||
#include <ndk/rtlfuncs.h>
|
||||
#include <ndk/obfuncs.h>
|
||||
#include <psdk/ntsecapi.h>
|
||||
#include <lsass/lsass.h>
|
||||
|
||||
|
@ -30,26 +31,35 @@ extern HANDLE Secur32Heap;
|
|||
NTSTATUS WINAPI
|
||||
LsaDeregisterLogonProcess(HANDLE LsaHandle)
|
||||
{
|
||||
LSASS_REQUEST Request;
|
||||
LSASS_REPLY Reply;
|
||||
LSA_API_MSG ApiMessage;
|
||||
NTSTATUS Status;
|
||||
|
||||
Request.Header.u1.s1.DataLength = 0;
|
||||
Request.Header.u1.s1.TotalLength = sizeof(LSASS_REQUEST);
|
||||
Request.Type = LSASS_REQUEST_DEREGISTER_LOGON_PROCESS;
|
||||
DPRINT1("LsaDeregisterLogonProcess()\n");
|
||||
|
||||
ApiMessage.ApiNumber = LSASS_REQUEST_DEREGISTER_LOGON_PROCESS;
|
||||
ApiMessage.h.u1.s1.DataLength = LSA_PORT_DATA_SIZE(ApiMessage.DeregisterLogonProcess.Request);
|
||||
ApiMessage.h.u1.s1.TotalLength = LSA_PORT_MESSAGE_SIZE;
|
||||
ApiMessage.h.u2.ZeroInit = 0;
|
||||
|
||||
Status = ZwRequestWaitReplyPort(LsaHandle,
|
||||
&Request.Header,
|
||||
&Reply.Header);
|
||||
(PPORT_MESSAGE)&ApiMessage,
|
||||
(PPORT_MESSAGE)&ApiMessage);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("ZwRequestWaitReplyPort() failed (Status 0x%08lx)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (!NT_SUCCESS(Reply.Status))
|
||||
if (!NT_SUCCESS(ApiMessage.Status))
|
||||
{
|
||||
return Reply.Status;
|
||||
DPRINT1("ZwRequestWaitReplyPort() failed (ApiMessage.Status 0x%08lx)\n", ApiMessage.Status);
|
||||
return ApiMessage.Status;
|
||||
}
|
||||
|
||||
NtClose(LsaHandle);
|
||||
|
||||
DPRINT1("LsaDeregisterLogonProcess() done (Status 0x%08lx)\n", Status);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -77,6 +87,7 @@ LsaCallAuthenticationPackage(HANDLE LsaHandle,
|
|||
PULONG ReturnBufferLength,
|
||||
PNTSTATUS ProtocolStatus)
|
||||
{
|
||||
#if 0
|
||||
PLSASS_REQUEST Request;
|
||||
PLSASS_REPLY Reply;
|
||||
LSASS_REQUEST RawRequest;
|
||||
|
@ -123,6 +134,9 @@ LsaCallAuthenticationPackage(HANDLE LsaHandle,
|
|||
*ReturnBufferLength);
|
||||
|
||||
return Status;
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -144,34 +158,42 @@ LsaLookupAuthenticationPackage(HANDLE LsaHandle,
|
|||
PLSA_STRING PackageName,
|
||||
PULONG AuthenticationPackage)
|
||||
{
|
||||
LSA_API_MSG ApiMessage;
|
||||
NTSTATUS Status;
|
||||
PLSASS_REQUEST Request;
|
||||
LSASS_REQUEST RawRequest;
|
||||
LSASS_REPLY Reply;
|
||||
|
||||
Request = (PLSASS_REQUEST)&RawRequest;
|
||||
Request->Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) + PackageName->Length -
|
||||
sizeof(PORT_MESSAGE);
|
||||
Request->Header.u1.s1.TotalLength = Request->Header.u1.s1.DataLength +
|
||||
sizeof(PORT_MESSAGE);
|
||||
Request->Type = LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE;
|
||||
/* Check the package name length */
|
||||
if (PackageName->Length > LSASS_MAX_PACKAGE_NAME_LENGTH)
|
||||
{
|
||||
return STATUS_NAME_TOO_LONG;
|
||||
}
|
||||
|
||||
ApiMessage.ApiNumber = LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE;
|
||||
ApiMessage.h.u1.s1.DataLength = LSA_PORT_DATA_SIZE(ApiMessage.LookupAuthenticationPackage.Request);
|
||||
ApiMessage.h.u1.s1.TotalLength = LSA_PORT_MESSAGE_SIZE;
|
||||
ApiMessage.h.u2.ZeroInit = 0;
|
||||
|
||||
ApiMessage.LookupAuthenticationPackage.Request.PackageNameLength = PackageName->Length;
|
||||
strncpy(ApiMessage.LookupAuthenticationPackage.Request.PackageName,
|
||||
PackageName->Buffer,
|
||||
ApiMessage.LookupAuthenticationPackage.Request.PackageNameLength);
|
||||
ApiMessage.LookupAuthenticationPackage.Request.PackageName[ApiMessage.LookupAuthenticationPackage.Request.PackageNameLength] = '\0';
|
||||
|
||||
Status = ZwRequestWaitReplyPort(LsaHandle,
|
||||
&Request->Header,
|
||||
&Reply.Header);
|
||||
(PPORT_MESSAGE)&ApiMessage,
|
||||
(PPORT_MESSAGE)&ApiMessage);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (!NT_SUCCESS(Reply.Status))
|
||||
if (!NT_SUCCESS(ApiMessage.Status))
|
||||
{
|
||||
return Reply.Status;
|
||||
return ApiMessage.Status;
|
||||
}
|
||||
|
||||
*AuthenticationPackage = Reply.d.LookupAuthenticationPackageReply.Package;
|
||||
*AuthenticationPackage = ApiMessage.LookupAuthenticationPackage.Reply.Package;
|
||||
|
||||
return Reply.Status;
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
@ -194,6 +216,7 @@ LsaLogonUser(HANDLE LsaHandle,
|
|||
PQUOTA_LIMITS Quotas,
|
||||
PNTSTATUS SubStatus)
|
||||
{
|
||||
#if 0
|
||||
ULONG RequestLength;
|
||||
ULONG CurrentLength;
|
||||
PLSASS_REQUEST Request;
|
||||
|
@ -276,6 +299,8 @@ LsaLogonUser(HANDLE LsaHandle,
|
|||
sizeof(Reply->d.LogonUserReply.Quotas));
|
||||
|
||||
return Status;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -289,33 +314,35 @@ LsaRegisterLogonProcess(PLSA_STRING LsaLogonProcessName,
|
|||
{
|
||||
UNICODE_STRING PortName; // = RTL_CONSTANT_STRING(L"\\LsaAuthenticationPort");
|
||||
SECURITY_QUALITY_OF_SERVICE SecurityQos;
|
||||
ULONG ConnectInfoLength;
|
||||
LSA_CONNECTION_INFO ConnectInfo;
|
||||
ULONG ConnectInfoLength = sizeof(ConnectInfo);
|
||||
LSA_API_MSG ApiMessage;
|
||||
HANDLE PortHandle = NULL;
|
||||
NTSTATUS Status;
|
||||
LSASS_CONNECT_DATA ConnectInfo;
|
||||
// LSASS_REQUEST Request;
|
||||
// LSASS_REPLY Reply;
|
||||
|
||||
DPRINT1("LsaRegisterLogonProcess()\n");
|
||||
|
||||
/* Check the logon process name length */
|
||||
if (LsaLogonProcessName->Length > LSASS_MAX_LOGON_PROCESS_NAME_LENGTH)
|
||||
return STATUS_NAME_TOO_LONG;
|
||||
|
||||
*Handle = NULL;
|
||||
|
||||
RtlInitUnicodeString(&PortName,
|
||||
L"\\LsaAuthenticationPort");
|
||||
|
||||
SecurityQos.Length = sizeof (SecurityQos);
|
||||
SecurityQos.Length = sizeof(SecurityQos);
|
||||
SecurityQos.ImpersonationLevel = SecurityIdentification;
|
||||
SecurityQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
|
||||
SecurityQos.EffectiveOnly = TRUE;
|
||||
|
||||
ConnectInfoLength = sizeof(LSASS_CONNECT_DATA);
|
||||
|
||||
strncpy(ConnectInfo.LogonProcessNameBuffer,
|
||||
LsaLogonProcessName->Buffer,
|
||||
LsaLogonProcessName->Length);
|
||||
ConnectInfo.Length = LsaLogonProcessName->Length;
|
||||
ConnectInfo.LogonProcessNameBuffer[ConnectInfo.Length] = '\0';
|
||||
|
||||
Status = ZwConnectPort(Handle,
|
||||
Status = ZwConnectPort(&PortHandle,
|
||||
&PortName,
|
||||
&SecurityQos,
|
||||
NULL,
|
||||
|
@ -325,42 +352,43 @@ LsaRegisterLogonProcess(PLSA_STRING LsaLogonProcessName,
|
|||
&ConnectInfoLength);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("ZwConnectPort failed (Status 0x%08lx)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
return Status;
|
||||
#if 0
|
||||
Request.Type = LSASS_REQUEST_REGISTER_LOGON_PROCESS;
|
||||
Request.Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) -
|
||||
sizeof(PORT_MESSAGE);
|
||||
Request.Header.u1.s1.TotalLength = sizeof(LSASS_REQUEST);
|
||||
ApiMessage.ApiNumber = LSASS_REQUEST_REGISTER_LOGON_PROCESS;
|
||||
ApiMessage.h.u1.s1.DataLength = LSA_PORT_DATA_SIZE(ApiMessage.RegisterLogonProcess.Request);
|
||||
ApiMessage.h.u1.s1.TotalLength = LSA_PORT_MESSAGE_SIZE;
|
||||
ApiMessage.h.u2.ZeroInit = 0;
|
||||
|
||||
Request.d.RegisterLogonProcessRequest.Length = LsaLogonProcessName->Length;
|
||||
memcpy(Request.d.RegisterLogonProcessRequest.LogonProcessNameBuffer,
|
||||
ApiMessage.RegisterLogonProcess.Request.Length = LsaLogonProcessName->Length;
|
||||
memcpy(ApiMessage.RegisterLogonProcess.Request.LogonProcessNameBuffer,
|
||||
LsaLogonProcessName->Buffer,
|
||||
Request.d.RegisterLogonProcessRequest.Length);
|
||||
ApiMessage.RegisterLogonProcess.Request.Length);
|
||||
|
||||
Status = ZwRequestWaitReplyPort(*Handle,
|
||||
&Request.Header,
|
||||
&Reply.Header);
|
||||
Status = ZwRequestWaitReplyPort(PortHandle,
|
||||
(PPORT_MESSAGE)&ApiMessage,
|
||||
(PPORT_MESSAGE)&ApiMessage);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
// NtClose(*Handle);
|
||||
// *Handle = NULL;
|
||||
DPRINT1("ZwRequestWaitReplyPort failed (Status 0x%08lx)\n", Status);
|
||||
NtClose(PortHandle);
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (!NT_SUCCESS(Reply.Status))
|
||||
if (!NT_SUCCESS(ApiMessage.Status))
|
||||
{
|
||||
// NtClose(*Handle);
|
||||
// *Handle = NULL;
|
||||
return Status;
|
||||
DPRINT1("ZwRequestWaitReplyPort failed (ApiMessage.Status 0x%08lx)\n", ApiMessage.Status);
|
||||
NtClose(PortHandle);
|
||||
return ApiMessage.Status;
|
||||
}
|
||||
|
||||
*OperationalMode = Reply.d.RegisterLogonProcessReply.OperationalMode;
|
||||
*Handle = PortHandle;
|
||||
*OperationalMode = ApiMessage.RegisterLogonProcess.Reply.OperationalMode;
|
||||
|
||||
return Reply.Status;
|
||||
#endif
|
||||
DPRINT1("LsaRegisterLogonProcess() done (Status 0x%08lx)\n", Status);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue