#include <ndk/lpctypes.h>
#include <ndk/lpcfuncs.h>
#include <ndk/rtlfuncs.h>
+#include <ndk/obfuncs.h>
#include <psdk/ntsecapi.h>
#include <lsass/lsass.h>
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;
}
PULONG ReturnBufferLength,
PNTSTATUS ProtocolStatus)
{
+ LSA_API_MSG ApiMessage;
+ NTSTATUS Status;
+
+ DPRINT1("LsaCallAuthenticationPackage()\n");
+
+ ApiMessage.ApiNumber = LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE;
+ ApiMessage.h.u1.s1.DataLength = LSA_PORT_DATA_SIZE(ApiMessage.CallAuthenticationPackage.Request);
+ ApiMessage.h.u1.s1.TotalLength = LSA_PORT_MESSAGE_SIZE;
+ ApiMessage.h.u2.ZeroInit = 0;
+
+ ApiMessage.CallAuthenticationPackage.Request.AuthenticationPackage = AuthenticationPackage;
+ ApiMessage.CallAuthenticationPackage.Request.ProtocolSubmitBuffer = ProtocolSubmitBuffer;
+ ApiMessage.CallAuthenticationPackage.Request.SubmitBufferLength = SubmitBufferLength;
+
+ Status = ZwRequestWaitReplyPort(LsaHandle,
+ (PPORT_MESSAGE)&ApiMessage,
+ (PPORT_MESSAGE)&ApiMessage);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("ZwRequestWaitReplyPort() failed (Status 0x%08lx)\n", Status);
+ return Status;
+ }
+
+ if (!NT_SUCCESS(ApiMessage.Status))
+ {
+ DPRINT1("ZwRequestWaitReplyPort() failed (ApiMessage.Status 0x%08lx)\n", ApiMessage.Status);
+ return ApiMessage.Status;
+ }
+
+ *ProtocolReturnBuffer = ApiMessage.CallAuthenticationPackage.Reply.ProtocolReturnBuffer;
+ *ReturnBufferLength = ApiMessage.CallAuthenticationPackage.Reply.ReturnBufferLength;
+ *ProtocolStatus = ApiMessage.CallAuthenticationPackage.Reply.ProtocolStatus;
+
+ return Status;
+
+
+#if 0
PLSASS_REQUEST Request;
PLSASS_REPLY Reply;
LSASS_REQUEST RawRequest;
*ReturnBufferLength);
return Status;
+#endif
}
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;
}
PQUOTA_LIMITS Quotas,
PNTSTATUS SubStatus)
{
+ LSA_API_MSG ApiMessage;
+ NTSTATUS Status;
+
+ ApiMessage.ApiNumber = LSASS_REQUEST_LOGON_USER;
+ ApiMessage.h.u1.s1.DataLength = LSA_PORT_DATA_SIZE(ApiMessage.LogonUser.Request);
+ ApiMessage.h.u1.s1.TotalLength = LSA_PORT_MESSAGE_SIZE;
+ ApiMessage.h.u2.ZeroInit = 0;
+
+ ApiMessage.LogonUser.Request.OriginName = *OriginName;
+ ApiMessage.LogonUser.Request.LogonType = LogonType;
+ ApiMessage.LogonUser.Request.AuthenticationPackage = AuthenticationPackage;
+ ApiMessage.LogonUser.Request.AuthenticationInformation = AuthenticationInformation;
+ ApiMessage.LogonUser.Request.AuthenticationInformationLength = AuthenticationInformationLength;
+ ApiMessage.LogonUser.Request.LocalGroups = LocalGroups;
+ if (LocalGroups != NULL)
+ ApiMessage.LogonUser.Request.LocalGroupsCount = LocalGroups->GroupCount;
+ else
+ ApiMessage.LogonUser.Request.LocalGroups = 0;
+ ApiMessage.LogonUser.Request.SourceContext = *SourceContext;
+
+ Status = ZwRequestWaitReplyPort(LsaHandle,
+ (PPORT_MESSAGE)&ApiMessage,
+ (PPORT_MESSAGE)&ApiMessage);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ if (!NT_SUCCESS(ApiMessage.Status))
+ {
+ return ApiMessage.Status;
+ }
+
+ *ProfileBuffer = ApiMessage.LogonUser.Reply.ProfileBuffer;
+ *ProfileBufferLength = ApiMessage.LogonUser.Reply.ProfileBufferLength;
+ *LogonId = ApiMessage.LogonUser.Reply.LogonId;
+ *Token = ApiMessage.LogonUser.Reply.Token;
+ *Quotas = ApiMessage.LogonUser.Reply.Quotas;
+ *SubStatus = ApiMessage.LogonUser.Reply.SubStatus;
+
+ return Status;
+
+#if 0
ULONG RequestLength;
ULONG CurrentLength;
PLSASS_REQUEST Request;
sizeof(Reply->d.LogonUserReply.Quotas));
return Status;
+#endif
}
{
UNICODE_STRING PortName; // = RTL_CONSTANT_STRING(L"\\LsaAuthenticationPort");
SECURITY_QUALITY_OF_SERVICE SecurityQos;
- ULONG ConnectInfoLength;
+ LSA_CONNECTION_INFO ConnectInfo;
+ ULONG ConnectInfoLength = sizeof(ConnectInfo);
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)
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);
&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);
-
- Request.d.RegisterLogonProcessRequest.Length = LsaLogonProcessName->Length;
- memcpy(Request.d.RegisterLogonProcessRequest.LogonProcessNameBuffer,
- LsaLogonProcessName->Buffer,
- Request.d.RegisterLogonProcessRequest.Length);
+ DPRINT("ConnectInfo.OperationalMode: 0x%08lx\n", ConnectInfo.OperationalMode);
+ *OperationalMode = ConnectInfo.OperationalMode;
- Status = ZwRequestWaitReplyPort(*Handle,
- &Request.Header,
- &Reply.Header);
if (!NT_SUCCESS(Status))
{
-// NtClose(*Handle);
-// *Handle = NULL;
- return Status;
- }
-
- if (!NT_SUCCESS(Reply.Status))
- {
-// NtClose(*Handle);
-// *Handle = NULL;
- return Status;
+ DPRINT1("ConnectInfo.Status: 0x%08lx\n", ConnectInfo.Status);
}
- *OperationalMode = Reply.d.RegisterLogonProcessReply.OperationalMode;
-
- return Reply.Status;
-#endif
+ return ConnectInfo.Status;
}