Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenlsa.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS system libraries 00004 * FILE: lib/lsalib/lsa.c 00005 * PURPOSE: Client-side LSA functions 00006 * UPDATE HISTORY: 00007 * Created 05/08/00 00008 */ 00009 00010 /* INCLUDES ******************************************************************/ 00011 00012 #include <ndk/lpctypes.h> 00013 #include <ndk/lpcfuncs.h> 00014 #include <ndk/rtlfuncs.h> 00015 #include <psdk/ntsecapi.h> 00016 #include <lsass/lsass.h> 00017 00018 #define NDEBUG 00019 #include <debug.h> 00020 00021 /* GLOBALS *******************************************************************/ 00022 00023 extern HANDLE Secur32Heap; 00024 00025 /* FUNCTIONS *****************************************************************/ 00026 00027 /* 00028 * @implemented 00029 */ 00030 NTSTATUS WINAPI 00031 LsaDeregisterLogonProcess(HANDLE LsaHandle) 00032 { 00033 LSASS_REQUEST Request; 00034 LSASS_REPLY Reply; 00035 NTSTATUS Status; 00036 00037 Request.Header.u1.s1.DataLength = 0; 00038 Request.Header.u1.s1.TotalLength = sizeof(LSASS_REQUEST); 00039 Request.Type = LSASS_REQUEST_DEREGISTER_LOGON_PROCESS; 00040 Status = ZwRequestWaitReplyPort(LsaHandle, 00041 &Request.Header, 00042 &Reply.Header); 00043 if (!NT_SUCCESS(Status)) 00044 { 00045 return Status; 00046 } 00047 00048 if (!NT_SUCCESS(Reply.Status)) 00049 { 00050 return Reply.Status; 00051 } 00052 00053 return Status; 00054 } 00055 00056 00057 /* 00058 * @unimplemented 00059 */ 00060 NTSTATUS WINAPI 00061 LsaConnectUntrusted(PHANDLE LsaHandle) 00062 { 00063 UNIMPLEMENTED; 00064 return STATUS_NOT_IMPLEMENTED; 00065 } 00066 00067 00068 /* 00069 * @implemented 00070 */ 00071 NTSTATUS WINAPI 00072 LsaCallAuthenticationPackage(HANDLE LsaHandle, 00073 ULONG AuthenticationPackage, 00074 PVOID ProtocolSubmitBuffer, 00075 ULONG SubmitBufferLength, 00076 PVOID *ProtocolReturnBuffer, 00077 PULONG ReturnBufferLength, 00078 PNTSTATUS ProtocolStatus) 00079 { 00080 PLSASS_REQUEST Request; 00081 PLSASS_REPLY Reply; 00082 LSASS_REQUEST RawRequest; 00083 LSASS_REPLY RawReply; 00084 NTSTATUS Status; 00085 ULONG OutBufferSize; 00086 00087 Request = (PLSASS_REQUEST)&RawRequest; 00088 Reply = (PLSASS_REPLY)&RawReply; 00089 00090 Request->Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) + SubmitBufferLength - 00091 sizeof(PORT_MESSAGE); 00092 Request->Header.u1.s1.TotalLength = 00093 Request->Header.u1.s1.DataLength + sizeof(PORT_MESSAGE); 00094 Request->Type = LSASS_REQUEST_CALL_AUTHENTICATION_PACKAGE; 00095 Request->d.CallAuthenticationPackageRequest.AuthenticationPackage = 00096 AuthenticationPackage; 00097 Request->d.CallAuthenticationPackageRequest.InBufferLength = 00098 SubmitBufferLength; 00099 memcpy(Request->d.CallAuthenticationPackageRequest.InBuffer, 00100 ProtocolSubmitBuffer, 00101 SubmitBufferLength); 00102 00103 Status = ZwRequestWaitReplyPort(LsaHandle, 00104 &Request->Header, 00105 &Reply->Header); 00106 if (!NT_SUCCESS(Status)) 00107 { 00108 return Status; 00109 } 00110 00111 if (!NT_SUCCESS(Reply->Status)) 00112 { 00113 return Reply->Status; 00114 } 00115 00116 OutBufferSize = Reply->d.CallAuthenticationPackageReply.OutBufferLength; 00117 *ProtocolReturnBuffer = RtlAllocateHeap(Secur32Heap, 00118 0, 00119 OutBufferSize); 00120 *ReturnBufferLength = OutBufferSize; 00121 memcpy(*ProtocolReturnBuffer, 00122 Reply->d.CallAuthenticationPackageReply.OutBuffer, 00123 *ReturnBufferLength); 00124 00125 return Status; 00126 } 00127 00128 00129 /* 00130 * @implemented 00131 */ 00132 NTSTATUS WINAPI 00133 LsaFreeReturnBuffer(PVOID Buffer) 00134 { 00135 return RtlFreeHeap(Secur32Heap, 0, Buffer); 00136 } 00137 00138 00139 /* 00140 * @implemented 00141 */ 00142 NTSTATUS WINAPI 00143 LsaLookupAuthenticationPackage(HANDLE LsaHandle, 00144 PLSA_STRING PackageName, 00145 PULONG AuthenticationPackage) 00146 { 00147 NTSTATUS Status; 00148 PLSASS_REQUEST Request; 00149 LSASS_REQUEST RawRequest; 00150 LSASS_REPLY Reply; 00151 00152 Request = (PLSASS_REQUEST)&RawRequest; 00153 Request->Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) + PackageName->Length - 00154 sizeof(PORT_MESSAGE); 00155 Request->Header.u1.s1.TotalLength = Request->Header.u1.s1.DataLength + 00156 sizeof(PORT_MESSAGE); 00157 Request->Type = LSASS_REQUEST_LOOKUP_AUTHENTICATION_PACKAGE; 00158 00159 Status = ZwRequestWaitReplyPort(LsaHandle, 00160 &Request->Header, 00161 &Reply.Header); 00162 if (!NT_SUCCESS(Status)) 00163 { 00164 return Status; 00165 } 00166 00167 if (!NT_SUCCESS(Reply.Status)) 00168 { 00169 return Reply.Status; 00170 } 00171 00172 *AuthenticationPackage = Reply.d.LookupAuthenticationPackageReply.Package; 00173 00174 return Reply.Status; 00175 } 00176 00177 00178 /* 00179 * @implemented 00180 */ 00181 NTSTATUS WINAPI 00182 LsaLogonUser(HANDLE LsaHandle, 00183 PLSA_STRING OriginName, 00184 SECURITY_LOGON_TYPE LogonType, 00185 ULONG AuthenticationPackage, 00186 PVOID AuthenticationInformation, 00187 ULONG AuthenticationInformationLength, 00188 PTOKEN_GROUPS LocalGroups, 00189 PTOKEN_SOURCE SourceContext, 00190 PVOID *ProfileBuffer, 00191 PULONG ProfileBufferLength, 00192 PLUID LogonId, 00193 PHANDLE Token, 00194 PQUOTA_LIMITS Quotas, 00195 PNTSTATUS SubStatus) 00196 { 00197 ULONG RequestLength; 00198 ULONG CurrentLength; 00199 PLSASS_REQUEST Request; 00200 LSASS_REQUEST RawMessage; 00201 PLSASS_REPLY Reply; 00202 LSASS_REPLY RawReply; 00203 NTSTATUS Status; 00204 00205 RequestLength = sizeof(LSASS_REQUEST) - sizeof(PORT_MESSAGE); 00206 RequestLength = RequestLength + (OriginName->Length * sizeof(WCHAR)); 00207 RequestLength = RequestLength + AuthenticationInformationLength; 00208 RequestLength = RequestLength + 00209 (LocalGroups->GroupCount * sizeof(SID_AND_ATTRIBUTES)); 00210 00211 CurrentLength = 0; 00212 Request = (PLSASS_REQUEST)&RawMessage; 00213 00214 Request->d.LogonUserRequest.OriginNameLength = OriginName->Length; 00215 Request->d.LogonUserRequest.OriginName = (PWSTR)&RawMessage + CurrentLength; 00216 memcpy((PWSTR)&RawMessage + CurrentLength, 00217 OriginName->Buffer, 00218 OriginName->Length * sizeof(WCHAR)); 00219 CurrentLength = CurrentLength + (OriginName->Length * sizeof(WCHAR)); 00220 00221 Request->d.LogonUserRequest.LogonType = LogonType; 00222 00223 Request->d.LogonUserRequest.AuthenticationPackage = 00224 AuthenticationPackage; 00225 00226 Request->d.LogonUserRequest.AuthenticationInformation = 00227 (PVOID)((ULONG_PTR)&RawMessage + CurrentLength); 00228 Request->d.LogonUserRequest.AuthenticationInformationLength = 00229 AuthenticationInformationLength; 00230 memcpy((PVOID)((ULONG_PTR)&RawMessage + CurrentLength), 00231 AuthenticationInformation, 00232 AuthenticationInformationLength); 00233 CurrentLength = CurrentLength + AuthenticationInformationLength; 00234 00235 Request->d.LogonUserRequest.LocalGroupsCount = LocalGroups->GroupCount; 00236 Request->d.LogonUserRequest.LocalGroups = 00237 (PSID_AND_ATTRIBUTES)&RawMessage + CurrentLength; 00238 memcpy((PSID_AND_ATTRIBUTES)&RawMessage + CurrentLength, 00239 LocalGroups->Groups, 00240 LocalGroups->GroupCount * sizeof(SID_AND_ATTRIBUTES)); 00241 00242 Request->d.LogonUserRequest.SourceContext = *SourceContext; 00243 00244 Request->Type = LSASS_REQUEST_LOGON_USER; 00245 Request->Header.u1.s1.DataLength = RequestLength - sizeof(PORT_MESSAGE); 00246 Request->Header.u1.s1.TotalLength = RequestLength + sizeof(PORT_MESSAGE); 00247 00248 Reply = (PLSASS_REPLY)&RawReply; 00249 00250 Status = ZwRequestWaitReplyPort(LsaHandle, 00251 &Request->Header, 00252 &Reply->Header); 00253 if (!NT_SUCCESS(Status)) 00254 { 00255 return Status; 00256 } 00257 00258 *SubStatus = Reply->d.LogonUserReply.SubStatus; 00259 00260 if (!NT_SUCCESS(Reply->Status)) 00261 { 00262 return Status; 00263 } 00264 00265 *ProfileBuffer = RtlAllocateHeap(Secur32Heap, 00266 0, 00267 Reply->d.LogonUserReply.ProfileBufferLength); 00268 memcpy(*ProfileBuffer, 00269 (PVOID)((ULONG_PTR)Reply->d.LogonUserReply.Data + 00270 (ULONG_PTR)Reply->d.LogonUserReply.ProfileBuffer), 00271 Reply->d.LogonUserReply.ProfileBufferLength); 00272 *LogonId = Reply->d.LogonUserReply.LogonId; 00273 *Token = Reply->d.LogonUserReply.Token; 00274 memcpy(Quotas, 00275 &Reply->d.LogonUserReply.Quotas, 00276 sizeof(Reply->d.LogonUserReply.Quotas)); 00277 00278 return Status; 00279 } 00280 00281 00282 /* 00283 * @implemented 00284 */ 00285 NTSTATUS WINAPI 00286 LsaRegisterLogonProcess(PLSA_STRING LsaLogonProcessName, 00287 PHANDLE Handle, 00288 PLSA_OPERATIONAL_MODE OperationalMode) 00289 { 00290 UNICODE_STRING PortName; // = RTL_CONSTANT_STRING(L"\\LsaAuthenticationPort"); 00291 SECURITY_QUALITY_OF_SERVICE SecurityQos; 00292 ULONG ConnectInfoLength; 00293 NTSTATUS Status; 00294 LSASS_CONNECT_DATA ConnectInfo; 00295 // LSASS_REQUEST Request; 00296 // LSASS_REPLY Reply; 00297 00298 /* Check the logon process name length */ 00299 if (LsaLogonProcessName->Length > LSASS_MAX_LOGON_PROCESS_NAME_LENGTH) 00300 return STATUS_NAME_TOO_LONG; 00301 00302 RtlInitUnicodeString(&PortName, 00303 L"\\LsaAuthenticationPort"); 00304 00305 SecurityQos.Length = sizeof (SecurityQos); 00306 SecurityQos.ImpersonationLevel = SecurityIdentification; 00307 SecurityQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING; 00308 SecurityQos.EffectiveOnly = TRUE; 00309 00310 ConnectInfoLength = sizeof(LSASS_CONNECT_DATA); 00311 00312 strncpy(ConnectInfo.LogonProcessNameBuffer, 00313 LsaLogonProcessName->Buffer, 00314 LsaLogonProcessName->Length); 00315 ConnectInfo.Length = LsaLogonProcessName->Length; 00316 ConnectInfo.LogonProcessNameBuffer[ConnectInfo.Length] = '\0'; 00317 00318 Status = ZwConnectPort(Handle, 00319 &PortName, 00320 &SecurityQos, 00321 NULL, 00322 NULL, 00323 NULL, 00324 &ConnectInfo, 00325 &ConnectInfoLength); 00326 if (!NT_SUCCESS(Status)) 00327 { 00328 return Status; 00329 } 00330 00331 return Status; 00332 #if 0 00333 Request.Type = LSASS_REQUEST_REGISTER_LOGON_PROCESS; 00334 Request.Header.u1.s1.DataLength = sizeof(LSASS_REQUEST) - 00335 sizeof(PORT_MESSAGE); 00336 Request.Header.u1.s1.TotalLength = sizeof(LSASS_REQUEST); 00337 00338 Request.d.RegisterLogonProcessRequest.Length = LsaLogonProcessName->Length; 00339 memcpy(Request.d.RegisterLogonProcessRequest.LogonProcessNameBuffer, 00340 LsaLogonProcessName->Buffer, 00341 Request.d.RegisterLogonProcessRequest.Length); 00342 00343 Status = ZwRequestWaitReplyPort(*Handle, 00344 &Request.Header, 00345 &Reply.Header); 00346 if (!NT_SUCCESS(Status)) 00347 { 00348 // NtClose(*Handle); 00349 // *Handle = NULL; 00350 return Status; 00351 } 00352 00353 if (!NT_SUCCESS(Reply.Status)) 00354 { 00355 // NtClose(*Handle); 00356 // *Handle = NULL; 00357 return Status; 00358 } 00359 00360 *OperationalMode = Reply.d.RegisterLogonProcessReply.OperationalMode; 00361 00362 return Reply.Status; 00363 #endif 00364 } 00365 00366 00367 /* 00368 * @unimplemented 00369 */ 00370 NTSTATUS 00371 WINAPI 00372 LsaEnumerateLogonSessions(PULONG LogonSessionCount, 00373 PLUID *LogonSessionList) 00374 { 00375 UNIMPLEMENTED; 00376 return STATUS_NOT_IMPLEMENTED; 00377 } 00378 00379 00380 /* 00381 * @unimplemented 00382 */ 00383 NTSTATUS 00384 WINAPI 00385 LsaGetLogonSessionData(PLUID LogonId, 00386 PSECURITY_LOGON_SESSION_DATA *ppLogonSessionData) 00387 { 00388 UNIMPLEMENTED; 00389 return STATUS_NOT_IMPLEMENTED; 00390 } 00391 00392 00393 /* 00394 * @unimplemented 00395 */ 00396 NTSTATUS 00397 WINAPI 00398 LsaRegisterPolicyChangeNotification(POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass, 00399 HANDLE NotificationEventHandle) 00400 { 00401 UNIMPLEMENTED; 00402 return STATUS_NOT_IMPLEMENTED; 00403 } 00404 00405 00406 /* 00407 * @unimplemented 00408 */ 00409 NTSTATUS 00410 WINAPI 00411 LsaUnregisterPolicyChangeNotification(POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass, 00412 HANDLE NotificationEventHandle) 00413 { 00414 UNIMPLEMENTED; 00415 return STATUS_NOT_IMPLEMENTED; 00416 } Generated on Sun May 27 2012 04:22:44 for ReactOS by
1.7.6.1
|