ReactOS  0.4.15-dev-3297-g037c744
session.c File Reference
#include "lsasrv.h"
Include dependency graph for session.c:

Go to the source code of this file.

Classes

struct  _LSAP_LOGON_SESSION
 

Typedefs

typedef struct _LSAP_LOGON_SESSION LSAP_LOGON_SESSION
 
typedef struct _LSAP_LOGON_SESSIONPLSAP_LOGON_SESSION
 

Functions

VOID LsapInitLogonSessions (VOID)
 
static PLSAP_LOGON_SESSION LsapGetLogonSession (IN PLUID LogonId)
 
NTSTATUS LsapSetLogonSessionData (_In_ PLUID LogonId, _In_ ULONG LogonType, _In_ PUNICODE_STRING UserName, _In_ PUNICODE_STRING LogonDomain, _In_ PSID Sid)
 
NTSTATUS NTAPI LsapCreateLogonSession (IN PLUID LogonId)
 
NTSTATUS NTAPI LsapDeleteLogonSession (IN PLUID LogonId)
 
NTSTATUS NTAPI LsapAddCredential (_In_ PLUID LogonId, _In_ ULONG AuthenticationPackage, _In_ PLSA_STRING PrimaryKeyValue, _In_ PLSA_STRING Credential)
 
NTSTATUS NTAPI LsapGetCredentials (_In_ PLUID LogonId, _In_ ULONG AuthenticationPackage, _Inout_ PULONG QueryContext, _In_ BOOLEAN RetrieveAllCredentials, _Inout_ PLSA_STRING PrimaryKeyValue, _Out_ PULONG PrimaryKeyLength, _Out_ PLSA_STRING Credentials)
 
NTSTATUS NTAPI LsapDeleteCredential (_In_ PLUID LogonId, _In_ ULONG AuthenticationPackage, _In_ PLSA_STRING PrimaryKeyValue)
 
NTSTATUS LsapEnumLogonSessions (IN OUT PLSA_API_MSG RequestMsg)
 
NTSTATUS LsapGetLogonSessionData (IN OUT PLSA_API_MSG RequestMsg)
 

Variables

LIST_ENTRY SessionListHead
 
ULONG SessionCount
 

Typedef Documentation

◆ LSAP_LOGON_SESSION

◆ PLSAP_LOGON_SESSION

Function Documentation

◆ LsapAddCredential()

NTSTATUS NTAPI LsapAddCredential ( _In_ PLUID  LogonId,
_In_ ULONG  AuthenticationPackage,
_In_ PLSA_STRING  PrimaryKeyValue,
_In_ PLSA_STRING  Credential 
)

Definition at line 259 of file session.c.

264 {
265 
266  return STATUS_SUCCESS;
267 }
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by LsapInitAuthPackages().

◆ LsapCreateLogonSession()

NTSTATUS NTAPI LsapCreateLogonSession ( IN PLUID  LogonId)

Definition at line 159 of file session.c.

160 {
161  PLSAP_LOGON_SESSION Session;
163 
164  TRACE("LsapCreateLogonSession(%p)\n", LogonId);
165 
166  /* Fail, if a session already exists */
169 
170  /* Allocate a new session entry */
171  Session = RtlAllocateHeap(RtlGetProcessHeap(),
173  sizeof(LSAP_LOGON_SESSION));
174  if (Session == NULL)
176 
177  /* Initialize the session entry */
178  RtlCopyLuid(&Session->LogonId, LogonId);
179 
180  TRACE("LsapCreateLogonSession(<0x%lx,0x%lx>)\n",
181  LogonId->HighPart, LogonId->LowPart);
182 
183  /* Tell ntoskrnl to create a new logon session */
185  if (!NT_SUCCESS(Status))
186  {
187  RtlFreeHeap(RtlGetProcessHeap(), 0, Session);
188  return Status;
189  }
190 
191  /* Insert the new session into the session list */
192  InsertHeadList(&SessionListHead, &Session->Entry);
193  SessionCount++;
194 
195  return STATUS_SUCCESS;
196 }
#define STATUS_LOGON_SESSION_COLLISION
Definition: ntstatus.h:497
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
Definition: rtlfuncs.h:201
static PLSAP_LOGON_SESSION LsapGetLogonSession(IN PLUID LogonId)
Definition: session.c:45
LONG NTSTATUS
Definition: precomp.h:26
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
NTSTATUS LsapRmCreateLogonSession(PLUID LogonId)
Definition: srm.c:245
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
Status
Definition: gdiplustypes.h:24
#define TRACE(s)
Definition: solgame.cpp:4
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
LIST_ENTRY SessionListHead
Definition: session.c:30
#define NULL
Definition: types.h:112
_IRQL_requires_same_ _In_ PLSA_STRING _In_ SECURITY_LOGON_TYPE _In_ ULONG _In_ ULONG _In_opt_ PTOKEN_GROUPS _In_ PTOKEN_SOURCE _Out_ PVOID _Out_ PULONG _Inout_ PLUID LogonId
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
NTSYSAPI void WINAPI RtlCopyLuid(PLUID, const LUID *)
#define STATUS_SUCCESS
Definition: shellext.h:65
ULONG SessionCount
Definition: session.c:31
LIST_ENTRY Entry
Definition: session.c:13

Referenced by LsapInitAuthPackages().

◆ LsapDeleteCredential()

NTSTATUS NTAPI LsapDeleteCredential ( _In_ PLUID  LogonId,
_In_ ULONG  AuthenticationPackage,
_In_ PLSA_STRING  PrimaryKeyValue 
)

Definition at line 288 of file session.c.

292 {
293 
294  return STATUS_SUCCESS;
295 }
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by LsapInitAuthPackages().

◆ LsapDeleteLogonSession()

NTSTATUS NTAPI LsapDeleteLogonSession ( IN PLUID  LogonId)

Definition at line 201 of file session.c.

202 {
203  PLSAP_LOGON_SESSION Session;
205 
206  TRACE("LsapDeleteLogonSession(%p)\n", LogonId);
207 
208  /* Fail, if the session does not exist */
209  Session = LsapGetLogonSession(LogonId);
210  if (Session == NULL)
212 
213  TRACE("LsapDeleteLogonSession(0x%08lx%08lx)\n",
214  LogonId->HighPart, LogonId->LowPart);
215 
216  /* Tell ntoskrnl to delete the logon session */
218  if (!NT_SUCCESS(Status))
219  return Status;
220 
221  /* Notify the authentication packages */
223 
224  /* Remove the session entry from the list */
225  RemoveEntryList(&Session->Entry);
226  SessionCount--;
227 
228  /* Free the session data */
229  if (Session->Sid != NULL)
230  RtlFreeHeap(RtlGetProcessHeap(), 0, Session->Sid);
231 
232  if (Session->UserName.Buffer != NULL)
233  RtlFreeHeap(RtlGetProcessHeap(), 0, Session->UserName.Buffer);
234 
235  if (Session->LogonDomain.Buffer != NULL)
236  RtlFreeHeap(RtlGetProcessHeap(), 0, Session->LogonDomain.Buffer);
237 
238  if (Session->AuthenticationPackage.Buffer != NULL)
239  RtlFreeHeap(RtlGetProcessHeap(), 0, Session->AuthenticationPackage.Buffer);
240 
241  if (Session->LogonServer.Buffer != NULL)
242  RtlFreeHeap(RtlGetProcessHeap(), 0, Session->LogonServer.Buffer);
243 
244  if (Session->DnsDomainName.Buffer != NULL)
245  RtlFreeHeap(RtlGetProcessHeap(), 0, Session->DnsDomainName.Buffer);
246 
247  if (Session->Upn.Buffer != NULL)
248  RtlFreeHeap(RtlGetProcessHeap(), 0, Session->Upn.Buffer);
249 
250  /* Free the session entry */
251  RtlFreeHeap(RtlGetProcessHeap(), 0, Session);
252 
253  return STATUS_SUCCESS;
254 }
#define STATUS_NO_SUCH_LOGON_SESSION
Definition: ntstatus.h:331
static PLSAP_LOGON_SESSION LsapGetLogonSession(IN PLUID LogonId)
Definition: session.c:45
LONG NTSTATUS
Definition: precomp.h:26
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
UNICODE_STRING UserName
Definition: session.c:19
UNICODE_STRING LogonServer
Definition: session.c:22
UNICODE_STRING LogonDomain
Definition: session.c:20
UNICODE_STRING AuthenticationPackage
Definition: session.c:21
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
NTSTATUS LsapRmDeleteLogonSession(PLUID LogonId)
Definition: srm.c:285
Status
Definition: gdiplustypes.h:24
#define TRACE(s)
Definition: solgame.cpp:4
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
UNICODE_STRING DnsDomainName
Definition: session.c:23
UNICODE_STRING Upn
Definition: session.c:24
#define NULL
Definition: types.h:112
_IRQL_requires_same_ _In_ PLSA_STRING _In_ SECURITY_LOGON_TYPE _In_ ULONG _In_ ULONG _In_opt_ PTOKEN_GROUPS _In_ PTOKEN_SOURCE _Out_ PVOID _Out_ PULONG _Inout_ PLUID LogonId
#define STATUS_SUCCESS
Definition: shellext.h:65
ULONG SessionCount
Definition: session.c:31
LIST_ENTRY Entry
Definition: session.c:13
VOID LsapTerminateLogon(_In_ PLUID LogonId)
Definition: authpackage.c:545

Referenced by LsapInitAuthPackages(), and LsapLogonUser().

◆ LsapEnumLogonSessions()

NTSTATUS LsapEnumLogonSessions ( IN OUT PLSA_API_MSG  RequestMsg)

Definition at line 299 of file session.c.

300 {
303  PLIST_ENTRY SessionEntry;
304  PLSAP_LOGON_SESSION CurrentSession;
305  PLUID SessionList;
306  ULONG i, Length;
307  SIZE_T MemSize;
308  PVOID ClientBaseAddress = NULL;
310 
311  TRACE("LsapEnumLogonSessions(%p)\n", RequestMsg);
312 
313  Length = SessionCount * sizeof(LUID);
314  SessionList = RtlAllocateHeap(RtlGetProcessHeap(),
316  Length);
317  if (SessionList == NULL)
319 
320  i = 0;
321  SessionEntry = SessionListHead.Flink;
322  while (SessionEntry != &SessionListHead)
323  {
324  CurrentSession = CONTAINING_RECORD(SessionEntry,
326  Entry);
327 
328  RtlCopyLuid(&SessionList[i],
329  &CurrentSession->LogonId);
330 
331  SessionEntry = SessionEntry->Flink;
332  i++;
333  }
334 
336  NULL,
337  0,
338  NULL,
339  NULL);
340 
344  &RequestMsg->h.ClientId);
345  if (!NT_SUCCESS(Status))
346  {
347  TRACE("NtOpenProcess() failed (Status %lx)\n", Status);
348  goto done;
349  }
350 
351  TRACE("Length: %lu\n", Length);
352 
353  MemSize = Length;
355  &ClientBaseAddress,
356  0,
357  &MemSize,
358  MEM_COMMIT,
360  if (!NT_SUCCESS(Status))
361  {
362  TRACE("NtAllocateVirtualMemory() failed (Status %lx)\n", Status);
363  goto done;
364  }
365 
366  TRACE("MemSize: %lu\n", MemSize);
367  TRACE("ClientBaseAddress: %p\n", ClientBaseAddress);
368 
370  ClientBaseAddress,
371  SessionList,
372  Length,
373  NULL);
374  if (!NT_SUCCESS(Status))
375  {
376  TRACE("NtWriteVirtualMemory() failed (Status %lx)\n", Status);
377  goto done;
378  }
379 
380  RequestMsg->EnumLogonSessions.Reply.LogonSessionCount = SessionCount;
381  RequestMsg->EnumLogonSessions.Reply.LogonSessionBuffer = ClientBaseAddress;
382 
383 done:
384  if (ProcessHandle != NULL)
386 
387  if (SessionList != NULL)
388  RtlFreeHeap(RtlGetProcessHeap(), 0, SessionList);
389 
390  return Status;
391 }
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
LONG NTSTATUS
Definition: precomp.h:26
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
#define MEM_COMMIT
Definition: nt_native.h:1313
NTSTATUS NTAPI NtOpenProcess(OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId)
Definition: process.c:1440
struct _LUID LUID
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
Status
Definition: gdiplustypes.h:24
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define TRACE(s)
Definition: solgame.cpp:4
#define PROCESS_VM_WRITE
Definition: pstypes.h:162
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3398
LIST_ENTRY SessionListHead
Definition: session.c:30
Definition: typedefs.h:119
ULONG_PTR SIZE_T
Definition: typedefs.h:80
NTSTATUS NTAPI NtAllocateVirtualMemory(IN HANDLE ProcessHandle, IN OUT PVOID *UBaseAddress, IN ULONG_PTR ZeroBits, IN OUT PSIZE_T URegionSize, IN ULONG AllocationType, IN ULONG Protect)
Definition: virtual.c:4481
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NULL
Definition: types.h:112
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
NTSYSAPI void WINAPI RtlCopyLuid(PLUID, const LUID *)
#define PROCESS_VM_READ
Definition: pstypes.h:161
unsigned int ULONG
Definition: retypes.h:1
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define PROCESS_VM_OPERATION
Definition: pstypes.h:160
_In_ HANDLE ProcessHandle
Definition: mmfuncs.h:403
NTSTATUS NTAPI NtWriteVirtualMemory(IN HANDLE ProcessHandle, IN PVOID BaseAddress, IN PVOID Buffer, IN SIZE_T NumberOfBytesToWrite, OUT PSIZE_T NumberOfBytesWritten OPTIONAL)
Definition: virtual.c:2919
ULONG SessionCount
Definition: session.c:31
base of all file and directory entries
Definition: entries.h:82
#define PAGE_READWRITE
Definition: nt_native.h:1304

Referenced by AuthPortThreadRoutine().

◆ LsapGetCredentials()

NTSTATUS NTAPI LsapGetCredentials ( _In_ PLUID  LogonId,
_In_ ULONG  AuthenticationPackage,
_Inout_ PULONG  QueryContext,
_In_ BOOLEAN  RetrieveAllCredentials,
_Inout_ PLSA_STRING  PrimaryKeyValue,
_Out_ PULONG  PrimaryKeyLength,
_Out_ PLSA_STRING  Credentials 
)

Definition at line 272 of file session.c.

280 {
281 
282  return STATUS_SUCCESS;
283 }
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by LsapInitAuthPackages().

◆ LsapGetLogonSession()

static PLSAP_LOGON_SESSION LsapGetLogonSession ( IN PLUID  LogonId)
static

Definition at line 45 of file session.c.

46 {
47  PLIST_ENTRY SessionEntry;
48  PLSAP_LOGON_SESSION CurrentSession;
49 
50  SessionEntry = SessionListHead.Flink;
51  while (SessionEntry != &SessionListHead)
52  {
53  CurrentSession = CONTAINING_RECORD(SessionEntry,
55  Entry);
56  if (RtlEqualLuid(&CurrentSession->LogonId, LogonId))
57  return CurrentSession;
58 
59  SessionEntry = SessionEntry->Flink;
60  }
61 
62  return NULL;
63 }
#define RtlEqualLuid(Luid1, Luid2)
Definition: rtlfuncs.h:301
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
LIST_ENTRY SessionListHead
Definition: session.c:30
Definition: typedefs.h:119
#define NULL
Definition: types.h:112
_IRQL_requires_same_ _In_ PLSA_STRING _In_ SECURITY_LOGON_TYPE _In_ ULONG _In_ ULONG _In_opt_ PTOKEN_GROUPS _In_ PTOKEN_SOURCE _Out_ PVOID _Out_ PULONG _Inout_ PLUID LogonId
base of all file and directory entries
Definition: entries.h:82

Referenced by LsapCreateLogonSession(), LsapDeleteLogonSession(), LsapGetLogonSessionData(), and LsapSetLogonSessionData().

◆ LsapGetLogonSessionData()

NTSTATUS LsapGetLogonSessionData ( IN OUT PLSA_API_MSG  RequestMsg)

Definition at line 395 of file session.c.

396 {
399  PLSAP_LOGON_SESSION Session;
400  PSECURITY_LOGON_SESSION_DATA LocalSessionData;
401  PVOID ClientBaseAddress = NULL;
402  ULONG TotalLength, SidLength = 0;
403  SIZE_T MemSize;
404  PUCHAR Ptr;
406 
407  TRACE("LsapGetLogonSessionData(%p)\n", RequestMsg);
408 
409  TRACE("LogonId: %lx\n", RequestMsg->GetLogonSessionData.Request.LogonId.LowPart);
410  Session = LsapGetLogonSession(&RequestMsg->GetLogonSessionData.Request.LogonId);
411  if (Session == NULL)
413 
414  /* Calculate the required buffer size */
416  Session->UserName.MaximumLength +
417  Session->LogonDomain.MaximumLength +
419  Session->LogonServer.MaximumLength +
420  Session->DnsDomainName.MaximumLength +
421  Session->Upn.MaximumLength;
422  if (Session->Sid != NULL)
423  {
424  SidLength = RtlLengthSid(Session->Sid);
425  TotalLength += SidLength;
426  }
427  TRACE("TotalLength: %lu\n", TotalLength);
428 
429  /* Allocate the buffer */
430  LocalSessionData = RtlAllocateHeap(RtlGetProcessHeap(),
432  TotalLength);
433  if (LocalSessionData == NULL)
435 
436  Ptr = (PUCHAR)((ULONG_PTR)LocalSessionData + sizeof(SECURITY_LOGON_SESSION_DATA));
437  TRACE("LocalSessionData: %p Ptr: %p\n", LocalSessionData, Ptr);
438 
439  LocalSessionData->Size = sizeof(SECURITY_LOGON_SESSION_DATA);
440 
441  /* Copy the LogonId */
442  RtlCopyLuid(&LocalSessionData->LogonId,
443  &RequestMsg->GetLogonSessionData.Request.LogonId);
444 
445  /* Copy the UserName string */
446  LocalSessionData->UserName.Length = Session->UserName.Length;
447  LocalSessionData->UserName.MaximumLength = Session->UserName.MaximumLength;
448  if (Session->UserName.MaximumLength != 0)
449  {
450  RtlCopyMemory(Ptr, Session->UserName.Buffer, Session->UserName.MaximumLength);
451  LocalSessionData->UserName.Buffer = (PWSTR)((ULONG_PTR)Ptr - (ULONG_PTR)LocalSessionData);
452 
453  Ptr = (PUCHAR)((ULONG_PTR)Ptr + Session->UserName.MaximumLength);
454  }
455 
456  /* Copy the LogonDomain string */
457  LocalSessionData->LogonDomain.Length = Session->LogonDomain.Length;
458  LocalSessionData->LogonDomain.MaximumLength = Session->LogonDomain.MaximumLength;
459  if (Session->LogonDomain.MaximumLength != 0)
460  {
462  LocalSessionData->LogonDomain.Buffer = (PWSTR)((ULONG_PTR)Ptr - (ULONG_PTR)LocalSessionData);
463 
464  Ptr = (PUCHAR)((ULONG_PTR)Ptr + Session->LogonDomain.MaximumLength);
465  }
466 
467  /* Copy the AuthenticationPackage string */
468  LocalSessionData->AuthenticationPackage.Length = Session->AuthenticationPackage.Length;
469  LocalSessionData->AuthenticationPackage.MaximumLength = Session->AuthenticationPackage.MaximumLength;
470  if (Session->AuthenticationPackage.MaximumLength != 0)
471  {
473  LocalSessionData->AuthenticationPackage.Buffer = (PWSTR)((ULONG_PTR)Ptr - (ULONG_PTR)LocalSessionData);
474 
476  }
477 
478  LocalSessionData->LogonType = Session->LogonType;
479  LocalSessionData->Session = 0;
480 
481  /* Sid */
482  if (Session->Sid != NULL)
483  {
484  RtlCopyMemory(Ptr, Session->Sid, SidLength);
485  LocalSessionData->Sid = (PSID)((ULONG_PTR)Ptr - (ULONG_PTR)LocalSessionData);
486 
487  Ptr = (PUCHAR)((ULONG_PTR)Ptr + SidLength);
488  }
489 
490  /* LogonTime */
491  LocalSessionData->LogonTime.QuadPart = Session->LogonTime.QuadPart;
492 
493  /* Copy the LogonServer string */
494  LocalSessionData->LogonServer.Length = Session->LogonServer.Length;
495  LocalSessionData->LogonServer.MaximumLength = Session->LogonServer.MaximumLength;
496  if (Session->LogonServer.MaximumLength != 0)
497  {
499  LocalSessionData->LogonServer.Buffer = (PWSTR)((ULONG_PTR)Ptr - (ULONG_PTR)LocalSessionData);
500 
501  Ptr = (PUCHAR)((ULONG_PTR)Ptr + Session->LogonServer.MaximumLength);
502  }
503 
504  /* Copy the DnsDomainName string */
505  LocalSessionData->DnsDomainName.Length = Session->DnsDomainName.Length;
506  LocalSessionData->DnsDomainName.MaximumLength = Session->DnsDomainName.MaximumLength;
507  if (Session->DnsDomainName.MaximumLength != 0)
508  {
510  LocalSessionData->DnsDomainName.Buffer = (PWSTR)((ULONG_PTR)Ptr - (ULONG_PTR)LocalSessionData);
511 
513  }
514 
515  /* Copy the Upn string */
516  LocalSessionData->Upn.Length = Session->Upn.Length;
517  LocalSessionData->Upn.MaximumLength = Session->Upn.MaximumLength;
518  if (Session->Upn.MaximumLength != 0)
519  {
520  RtlCopyMemory(Ptr, Session->Upn.Buffer, Session->Upn.MaximumLength);
521  LocalSessionData->Upn.Buffer = (PWSTR)((ULONG_PTR)Ptr - (ULONG_PTR)LocalSessionData);
522 
523  Ptr = (PUCHAR)((ULONG_PTR)Ptr + Session->Upn.MaximumLength);
524  }
525 
527  NULL,
528  0,
529  NULL,
530  NULL);
531 
535  &RequestMsg->h.ClientId);
536  if (!NT_SUCCESS(Status))
537  {
538  TRACE("NtOpenProcess() failed (Status %lx)\n", Status);
539  goto done;
540  }
541 
542  MemSize = TotalLength;
544  &ClientBaseAddress,
545  0,
546  &MemSize,
547  MEM_COMMIT,
549  if (!NT_SUCCESS(Status))
550  {
551  TRACE("NtAllocateVirtualMemory() failed (Status %lx)\n", Status);
552  goto done;
553  }
554 
555  TRACE("MemSize: %lu\n", MemSize);
556  TRACE("ClientBaseAddress: %p\n", ClientBaseAddress);
557 
559  ClientBaseAddress,
560  LocalSessionData,
561  TotalLength,
562  NULL);
563  if (!NT_SUCCESS(Status))
564  {
565  TRACE("NtWriteVirtualMemory() failed (Status %lx)\n", Status);
566  goto done;
567  }
568 
569  RequestMsg->GetLogonSessionData.Reply.SessionDataBuffer = ClientBaseAddress;
570 
571 done:
572  if (ProcessHandle != NULL)
574 
575  if (LocalSessionData != NULL)
576  RtlFreeHeap(RtlGetProcessHeap(), 0, LocalSessionData);
577 
578  return Status;
579 }
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
USHORT MaximumLength
Definition: env_spec_w32.h:370
struct _SECURITY_LOGON_SESSION_DATA SECURITY_LOGON_SESSION_DATA
#define STATUS_NO_SUCH_LOGON_SESSION
Definition: ntstatus.h:331
uint16_t * PWSTR
Definition: typedefs.h:56
static PLSAP_LOGON_SESSION LsapGetLogonSession(IN PLUID LogonId)
Definition: session.c:45
unsigned char * PUCHAR
Definition: retypes.h:3
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
LONG NTSTATUS
Definition: precomp.h:26
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
UNICODE_STRING UserName
Definition: session.c:19
UNICODE_STRING LogonServer
Definition: session.c:22
if(dx==0 &&dy==0)
Definition: linetemp.h:174
_In_ ULONG TotalLength
Definition: usbdlib.h:158
#define MEM_COMMIT
Definition: nt_native.h:1313
UNICODE_STRING LogonDomain
Definition: session.c:20
NTSTATUS NTAPI NtOpenProcess(OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId)
Definition: process.c:1440
UNICODE_STRING AuthenticationPackage
Definition: session.c:21
uint32_t ULONG_PTR
Definition: typedefs.h:65
NTSYSAPI ULONG NTAPI RtlLengthSid(IN PSID Sid)
Definition: sid.c:150
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
Status
Definition: gdiplustypes.h:24
#define TRACE(s)
Definition: solgame.cpp:4
#define PROCESS_VM_WRITE
Definition: pstypes.h:162
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
UNICODE_STRING DnsDomainName
Definition: session.c:23
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3398
struct _SID * PSID
Definition: eventlog.c:35
UNICODE_STRING Upn
Definition: session.c:24
ULONG_PTR SIZE_T
Definition: typedefs.h:80
NTSTATUS NTAPI NtAllocateVirtualMemory(IN HANDLE ProcessHandle, IN OUT PVOID *UBaseAddress, IN ULONG_PTR ZeroBits, IN OUT PSIZE_T URegionSize, IN ULONG AllocationType, IN ULONG Protect)
Definition: virtual.c:4481
USHORT MaximumLength
Definition: ntsecapi.h:164
LARGE_INTEGER LogonTime
Definition: session.c:17
#define NULL
Definition: types.h:112
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
NTSYSAPI void WINAPI RtlCopyLuid(PLUID, const LUID *)
#define PROCESS_VM_READ
Definition: pstypes.h:161
unsigned int ULONG
Definition: retypes.h:1
#define ULONG_PTR
Definition: config.h:101
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define PROCESS_VM_OPERATION
Definition: pstypes.h:160
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
_In_ HANDLE ProcessHandle
Definition: mmfuncs.h:403
NTSTATUS NTAPI NtWriteVirtualMemory(IN HANDLE ProcessHandle, IN PVOID BaseAddress, IN PVOID Buffer, IN SIZE_T NumberOfBytesToWrite, OUT PSIZE_T NumberOfBytesWritten OPTIONAL)
Definition: virtual.c:2919
LSA_UNICODE_STRING UserName
Definition: ntsecapi.h:306
LONGLONG QuadPart
Definition: typedefs.h:114
#define PAGE_READWRITE
Definition: nt_native.h:1304

Referenced by AuthPortThreadRoutine().

◆ LsapInitLogonSessions()

VOID LsapInitLogonSessions ( VOID  )

Definition at line 36 of file session.c.

37 {
39  SessionCount = 0;
40 }
LIST_ENTRY SessionListHead
Definition: session.c:30
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
ULONG SessionCount
Definition: session.c:31

Referenced by LsapInitLsa().

◆ LsapSetLogonSessionData()

NTSTATUS LsapSetLogonSessionData ( _In_ PLUID  LogonId,
_In_ ULONG  LogonType,
_In_ PUNICODE_STRING  UserName,
_In_ PUNICODE_STRING  LogonDomain,
_In_ PSID  Sid 
)

Definition at line 67 of file session.c.

73 {
75  PLSAP_LOGON_SESSION Session;
76  ULONG Length;
77 
78  TRACE("LsapSetLogonSessionData(%p)\n", LogonId);
79 
80  Session = LsapGetLogonSession(LogonId);
81  if (Session == NULL)
83 
84  TRACE("LogonType %lu\n", LogonType);
85  Session->LogonType = LogonType;
86 
87  Status = RtlValidateUnicodeString(0, UserName);
88  if (!NT_SUCCESS(Status))
90 
91  /* UserName is mandatory and cannot be an empty string */
92  TRACE("UserName %wZ\n", UserName);
93  Session->UserName.Buffer = RtlAllocateHeap(RtlGetProcessHeap(),
95  UserName->MaximumLength);
96  if (Session->UserName.Buffer == NULL)
98 
99  Session->UserName.Length = UserName->Length;
100  Session->UserName.MaximumLength = UserName->MaximumLength;
101  RtlCopyMemory(Session->UserName.Buffer, UserName->Buffer, UserName->MaximumLength);
102 
103  Status = RtlValidateUnicodeString(0, LogonDomain);
104  if (!NT_SUCCESS(Status))
105  {
106  /* Cleanup and fail */
107  if (Session->UserName.Buffer != NULL)
108  RtlFreeHeap(RtlGetProcessHeap(), 0, Session->UserName.Buffer);
109 
111  }
112 
113  /* LogonDomain is optional and can be an empty string */
114  TRACE("LogonDomain %wZ\n", LogonDomain);
115  if (LogonDomain->Length)
116  {
117  Session->LogonDomain.Buffer = RtlAllocateHeap(RtlGetProcessHeap(),
119  LogonDomain->MaximumLength);
120  if (Session->LogonDomain.Buffer == NULL)
121  {
122  /* Cleanup and fail */
123  if (Session->UserName.Buffer != NULL)
124  RtlFreeHeap(RtlGetProcessHeap(), 0, Session->UserName.Buffer);
125 
127  }
128 
129  Session->LogonDomain.Length = LogonDomain->Length;
130  Session->LogonDomain.MaximumLength = LogonDomain->MaximumLength;
131  RtlCopyMemory(Session->LogonDomain.Buffer, LogonDomain->Buffer, LogonDomain->MaximumLength);
132  }
133  else
134  {
135  RtlInitEmptyUnicodeString(&Session->LogonDomain, NULL, 0);
136  }
137 
139  Session->Sid = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, Length);
140  if (Session->Sid == NULL)
141  {
142  /* Cleanup and fail */
143  if (Session->LogonDomain.Buffer != NULL)
144  RtlFreeHeap(RtlGetProcessHeap(), 0, Session->LogonDomain.Buffer);
145  if (Session->UserName.Buffer != NULL)
146  RtlFreeHeap(RtlGetProcessHeap(), 0, Session->UserName.Buffer);
147 
149  }
150 
151  RtlCopyMemory(Session->Sid, Sid, Length);
152 
153  return STATUS_SUCCESS;
154 }
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
USHORT MaximumLength
Definition: env_spec_w32.h:370
#define STATUS_NO_SUCH_LOGON_SESSION
Definition: ntstatus.h:331
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
static PLSAP_LOGON_SESSION LsapGetLogonSession(IN PLUID LogonId)
Definition: session.c:45
LONG NTSTATUS
Definition: precomp.h:26
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
UNICODE_STRING UserName
Definition: session.c:19
UNICODE_STRING LogonDomain
Definition: session.c:20
NTSYSAPI NTSTATUS NTAPI RtlValidateUnicodeString(_In_ ULONG Flags, _In_ PCUNICODE_STRING String)
Definition: unicode.c:2559
_In_ ULONG _In_ ACCESS_MASK _In_ PSID Sid
Definition: rtlfuncs.h:1103
NTSYSAPI ULONG NTAPI RtlLengthSid(IN PSID Sid)
Definition: sid.c:150
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
Status
Definition: gdiplustypes.h:24
#define TRACE(s)
Definition: solgame.cpp:4
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_IRQL_requires_same_ _In_ PLSA_STRING _In_ SECURITY_LOGON_TYPE LogonType
#define NULL
Definition: types.h:112
_IRQL_requires_same_ _In_ PLSA_STRING _In_ SECURITY_LOGON_TYPE _In_ ULONG _In_ ULONG _In_opt_ PTOKEN_GROUPS _In_ PTOKEN_SOURCE _Out_ PVOID _Out_ PULONG _Inout_ PLUID LogonId
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
unsigned int ULONG
Definition: retypes.h:1
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by LsapLogonUser().

Variable Documentation

◆ SessionCount

◆ SessionListHead