Something went wrong. Try again.
Reactos
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329/* * ReactOS kernel * Copyright (C) 2004 ReactOS Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *//* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries * PURPOSE: SAM interface library * FILE: lib/samlib/samlib.c * PROGRAMER: Eric Kohl */
#include "precomp.h"
#define NTOS_MODE_USER#include <ndk/rtlfuncs.h>#include <ntsam.h>#include <sam_c.h>
#include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(samlib);
NTSTATUSWINAPISystemFunction006(LPCSTR password, LPSTR hash);
NTSTATUSWINAPISystemFunction007(PUNICODE_STRING string, LPBYTE hash);
NTSTATUSWINAPISystemFunction012(const BYTE *in, const BYTE *key, LPBYTE out);
/* GLOBALS *******************************************************************/
/* FUNCTIONS *****************************************************************/
void __RPC_FAR * __RPC_USER midl_user_allocate(SIZE_T len){ return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);}
void __RPC_USER midl_user_free(void __RPC_FAR * ptr){ HeapFree(GetProcessHeap(), 0, ptr);}
handle_t __RPC_USERPSAMPR_SERVER_NAME_bind(PSAMPR_SERVER_NAME pszSystemName){ handle_t hBinding = NULL; LPWSTR pszStringBinding; RPC_STATUS status;
TRACE("PSAMPR_SERVER_NAME_bind(%S)\n", pszSystemName);
/* Check the server name prefix and server name length */ if (pszSystemName != NULL) { int nLength = wcslen(pszSystemName); int nNameLength = nLength;
if (nLength >= 1 && pszSystemName[0] == L'\\') nNameLength--;
if (nLength >= 2 && pszSystemName[1] == L'\\') nNameLength--;
if (((nLength - nNameLength != 0) && (nLength - nNameLength != 2)) || (nNameLength == 0)) { WARN("Invalid server name %S\n", pszSystemName); RpcRaiseException(STATUS_OBJECT_NAME_INVALID); } }
status = RpcStringBindingComposeW(NULL, L"ncacn_np", pszSystemName, L"\\pipe\\samr", NULL, &pszStringBinding); if (status) { TRACE("RpcStringBindingCompose returned 0x%x\n", status); return NULL; }
/* Set the binding handle that will be used to bind to the server. */ status = RpcBindingFromStringBindingW(pszStringBinding, &hBinding); if (status) { TRACE("RpcBindingFromStringBinding returned 0x%x\n", status); }
status = RpcStringFreeW(&pszStringBinding); if (status) {// TRACE("RpcStringFree returned 0x%x\n", status); }
return hBinding;}
void __RPC_USERPSAMPR_SERVER_NAME_unbind(PSAMPR_SERVER_NAME pszSystemName, handle_t hBinding){ RPC_STATUS status;
TRACE("PSAMPR_SERVER_NAME_unbind(%S)\n", pszSystemName);
status = RpcBindingFree(&hBinding); if (status) { TRACE("RpcBindingFree returned 0x%x\n", status); }}
NTSTATUSSampCheckPassword(IN SAMPR_HANDLE UserHandle, IN PUNICODE_STRING Password){ USER_DOMAIN_PASSWORD_INFORMATION DomainPasswordInformation; LPWORD CharTypeBuffer = NULL; ULONG PasswordLength; ULONG i; ULONG Upper = 0, Lower = 0, Digit = 0, Punct = 0, Alpha = 0; NTSTATUS Status = STATUS_SUCCESS;
TRACE("SampCheckPassword(%p %p)\n", UserHandle, Password);
/* Get the domain password information */ Status = SamrGetUserDomainPasswordInformation(UserHandle, &DomainPasswordInformation); if (!NT_SUCCESS(Status)) { TRACE("SamrGetUserDomainPasswordInformation failed (Status 0x%08lx)\n", Status); return Status; }
PasswordLength = (ULONG)(Password->Length / sizeof(WCHAR));
/* Fail if the password is too short or too long */ if ((PasswordLength < DomainPasswordInformation.MinPasswordLength) || (PasswordLength > 256)) return STATUS_PASSWORD_RESTRICTION;
/* Check the password complexity */ if (DomainPasswordInformation.PasswordProperties & DOMAIN_PASSWORD_COMPLEX) { CharTypeBuffer = midl_user_allocate(PasswordLength * sizeof(WORD)); if (CharTypeBuffer == NULL) return STATUS_INSUFFICIENT_RESOURCES;
GetStringTypeW(CT_CTYPE1, Password->Buffer, PasswordLength, CharTypeBuffer);
for (i = 0; i < PasswordLength; i++) { TRACE("%lu: %C %s %s %s %s\n", i, Password->Buffer[i], (CharTypeBuffer[i] & C1_UPPER) ? "C1_UPPER" : " ", (CharTypeBuffer[i] & C1_LOWER) ? "C1_LOWER" : " ", (CharTypeBuffer[i] & C1_DIGIT) ? "C1_DIGIT" : " ", (CharTypeBuffer[i] & C1_PUNCT) ? "C1_PUNCT" : " ", (CharTypeBuffer[i] & C1_ALPHA) ? "C1_ALPHA" : " ");
if (CharTypeBuffer[i] & C1_UPPER) Upper = 1;
if (CharTypeBuffer[i] & C1_LOWER) Lower = 1;
if (CharTypeBuffer[i] & C1_DIGIT) Digit = 1;
if (CharTypeBuffer[i] & C1_PUNCT) Punct = 1;
if ((CharTypeBuffer[i] & C1_ALPHA) && !(CharTypeBuffer[i] & C1_UPPER) && !(CharTypeBuffer[i] & C1_LOWER)) Alpha = 1; }
TRACE("Upper: %lu\n", Upper); TRACE("Lower: %lu\n", Lower); TRACE("Digit: %lu\n", Digit); TRACE("Punct: %lu\n", Punct); TRACE("Alpha: %lu\n", Alpha);
TRACE("Total: %lu\n", Upper + Lower + Digit + Punct + Alpha); if (Upper + Lower + Digit + Punct + Alpha < 3) Status = STATUS_PASSWORD_RESTRICTION; }
if (CharTypeBuffer != NULL) midl_user_free(CharTypeBuffer);
return Status;}
NTSTATUSNTAPISamAddMemberToAlias(IN SAM_HANDLE AliasHandle, IN PSID MemberId){ NTSTATUS Status;
TRACE("SamAddMemberToAlias(%p %p)\n", AliasHandle, MemberId);
RpcTryExcept { Status = SamrAddMemberToAlias((SAMPR_HANDLE)AliasHandle, (PRPC_SID)MemberId); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamAddMemberToGroup(IN SAM_HANDLE GroupHandle, IN ULONG MemberId, IN ULONG Attributes){ NTSTATUS Status;
TRACE("SamAddMemberToGroup(%p %lu %lx)\n", GroupHandle, MemberId, Attributes);
RpcTryExcept { Status = SamrAddMemberToGroup((SAMPR_HANDLE)GroupHandle, MemberId, Attributes); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamAddMultipleMembersToAlias(IN SAM_HANDLE AliasHandle, IN PSID *MemberIds, IN ULONG MemberCount){ SAMPR_PSID_ARRAY Buffer; NTSTATUS Status;
TRACE("SamAddMultipleMembersToAlias(%p %p %lu)\n", AliasHandle, MemberIds, MemberCount);
if (MemberIds == NULL) return STATUS_INVALID_PARAMETER_2;
Buffer.Count = MemberCount; Buffer.Sids = (PSAMPR_SID_INFORMATION)MemberIds;
RpcTryExcept { Status = SamrAddMultipleMembersToAlias((SAMPR_HANDLE)AliasHandle, &Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamChangePasswordUser(IN SAM_HANDLE UserHandle, IN PUNICODE_STRING OldPassword, IN PUNICODE_STRING NewPassword){ NT_OWF_PASSWORD OldNtPassword; NT_OWF_PASSWORD NewNtPassword; LM_OWF_PASSWORD OldLmPassword; LM_OWF_PASSWORD NewLmPassword; OEM_STRING LmPwdString; CHAR LmPwdBuffer[15]; BOOLEAN OldLmPasswordPresent = FALSE; BOOLEAN NewLmPasswordPresent = FALSE; NTSTATUS Status;
ENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm; ENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm; ENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt; ENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt; PENCRYPTED_LM_OWF_PASSWORD pOldLmEncryptedWithNewLm = NULL; PENCRYPTED_LM_OWF_PASSWORD pNewLmEncryptedWithOldLm = NULL;
/* Calculate the NT hash for the old password */ Status = SystemFunction007(OldPassword, (LPBYTE)&OldNtPassword); if (!NT_SUCCESS(Status)) { TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status); return Status; }
/* Calculate the NT hash for the new password */ Status = SystemFunction007(NewPassword, (LPBYTE)&NewNtPassword); if (!NT_SUCCESS(Status)) { TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status); return Status; }
/* Calculate the LM password and hash for the old password */ LmPwdString.Length = 15; LmPwdString.MaximumLength = 15; LmPwdString.Buffer = LmPwdBuffer; ZeroMemory(LmPwdString.Buffer, LmPwdString.MaximumLength);
Status = RtlUpcaseUnicodeStringToOemString(&LmPwdString, OldPassword, FALSE); if (NT_SUCCESS(Status)) { /* Calculate the LM hash value of the password */ Status = SystemFunction006(LmPwdString.Buffer, (LPSTR)&OldLmPassword); if (NT_SUCCESS(Status)) { OldLmPasswordPresent = TRUE; } }
/* Calculate the LM password and hash for the new password */ LmPwdString.Length = 15; LmPwdString.MaximumLength = 15; LmPwdString.Buffer = LmPwdBuffer; ZeroMemory(LmPwdString.Buffer, LmPwdString.MaximumLength);
Status = RtlUpcaseUnicodeStringToOemString(&LmPwdString, NewPassword, FALSE); if (NT_SUCCESS(Status)) { /* Calculate the LM hash value of the password */ Status = SystemFunction006(LmPwdString.Buffer, (LPSTR)&NewLmPassword); if (NT_SUCCESS(Status)) { NewLmPasswordPresent = TRUE; } }
if (OldLmPasswordPresent && NewLmPasswordPresent) { /* Encrypt the old LM hash with the new LM hash */ Status = SystemFunction012((const BYTE *)&OldLmPassword, (const BYTE *)&NewLmPassword, (LPBYTE)&OldLmEncryptedWithNewLm); if (!NT_SUCCESS(Status)) { TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status); return Status; }
/* Encrypt the new LM hash with the old LM hash */ Status = SystemFunction012((const BYTE *)&NewLmPassword, (const BYTE *)&OldLmPassword, (LPBYTE)&NewLmEncryptedWithOldLm); if (!NT_SUCCESS(Status)) { TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status); return Status; }
pOldLmEncryptedWithNewLm = &OldLmEncryptedWithNewLm; pNewLmEncryptedWithOldLm = &NewLmEncryptedWithOldLm; }
/* Encrypt the old NT hash with the new NT hash */ Status = SystemFunction012((const BYTE *)&OldNtPassword, (const BYTE *)&NewNtPassword, (LPBYTE)&OldNtEncryptedWithNewNt); if (!NT_SUCCESS(Status)) { TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status); return Status; }
/* Encrypt the new NT hash with the old NT hash */ Status = SystemFunction012((const BYTE *)&NewNtPassword, (const BYTE *)&OldNtPassword, (LPBYTE)&NewNtEncryptedWithOldNt); if (!NT_SUCCESS(Status)) { TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status); return Status; }
RpcTryExcept { Status = SamrChangePasswordUser((SAMPR_HANDLE)UserHandle, OldLmPasswordPresent && NewLmPasswordPresent, pOldLmEncryptedWithNewLm, pNewLmEncryptedWithOldLm, TRUE, &OldNtEncryptedWithNewNt, &NewNtEncryptedWithOldNt, FALSE, NULL, FALSE, NULL); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamChangePasswordUser2(IN PUNICODE_STRING ServerName, IN PUNICODE_STRING UserName, IN PUNICODE_STRING OldPassword, IN PUNICODE_STRING NewPassword){ UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED;}
NTSTATUSNTAPISamChangePasswordUser3(IN PUNICODE_STRING ServerName, IN PUNICODE_STRING UserName, IN PUNICODE_STRING OldPassword, IN PUNICODE_STRING NewPassword, OUT PDOMAIN_PASSWORD_INFORMATION *EffectivePasswordPolicy, OUT PUSER_PWD_CHANGE_FAILURE_INFORMATION *PasswordChangeFailureInfo){ UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED;}
NTSTATUSNTAPISamCloseHandle(IN SAM_HANDLE SamHandle){ NTSTATUS Status;
TRACE("SamCloseHandle(%p)\n", SamHandle);
RpcTryExcept { Status = SamrCloseHandle((SAMPR_HANDLE *)&SamHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamConnect(IN OUT PUNICODE_STRING ServerName OPTIONAL, OUT PSAM_HANDLE ServerHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes){ PSAMPR_SERVER_NAME pServerName = NULL; NTSTATUS Status;
TRACE("SamConnect(%p %p 0x%08x %p)\n", ServerName, ServerHandle, DesiredAccess, ObjectAttributes);
if (ServerName != NULL && ServerName->Length > 0 && ServerName->Buffer != NULL) { /* Create a zero-terminated server name */ pServerName = midl_user_allocate(ServerName->Length + sizeof(WCHAR)); if (pServerName == NULL) return STATUS_INSUFFICIENT_RESOURCES;
CopyMemory(pServerName, ServerName->Buffer, ServerName->Length); pServerName[ServerName->Length / sizeof(WCHAR)] = UNICODE_NULL; }
RpcTryExcept { Status = SamrConnect(pServerName, (SAMPR_HANDLE *)ServerHandle, DesiredAccess); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
if (pServerName) midl_user_free(pServerName);
return Status;}
NTSTATUSNTAPISamCreateAliasInDomain(IN SAM_HANDLE DomainHandle, IN PUNICODE_STRING AccountName, IN ACCESS_MASK DesiredAccess, OUT PSAM_HANDLE AliasHandle, OUT PULONG RelativeId){ NTSTATUS Status;
TRACE("SamCreateAliasInDomain(%p %p 0x%08x %p %p)\n", DomainHandle, AccountName, DesiredAccess, AliasHandle, RelativeId);
*AliasHandle = NULL; *RelativeId = 0;
RpcTryExcept { Status = SamrCreateAliasInDomain((SAMPR_HANDLE)DomainHandle, (PRPC_UNICODE_STRING)AccountName, DesiredAccess, (SAMPR_HANDLE *)AliasHandle, RelativeId); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamCreateGroupInDomain(IN SAM_HANDLE DomainHandle, IN PUNICODE_STRING AccountName, IN ACCESS_MASK DesiredAccess, OUT PSAM_HANDLE GroupHandle, OUT PULONG RelativeId){ NTSTATUS Status;
TRACE("SamCreateGroupInDomain(%p %p 0x%08x %p %p)\n", DomainHandle, AccountName, DesiredAccess, GroupHandle, RelativeId);
*GroupHandle = NULL; *RelativeId = 0;
RpcTryExcept { Status = SamrCreateGroupInDomain((SAMPR_HANDLE)DomainHandle, (PRPC_UNICODE_STRING)AccountName, DesiredAccess, (SAMPR_HANDLE *)GroupHandle, RelativeId); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamCreateUser2InDomain(IN SAM_HANDLE DomainHandle, IN PUNICODE_STRING AccountName, IN ULONG AccountType, IN ACCESS_MASK DesiredAccess, OUT PSAM_HANDLE UserHandle, OUT PULONG GrantedAccess, OUT PULONG RelativeId){ NTSTATUS Status;
TRACE("SamCreateUser2InDomain(%p %p %lu 0x%08x %p %p %p)\n", DomainHandle, AccountName, AccountType, DesiredAccess, UserHandle, GrantedAccess, RelativeId);
*UserHandle = NULL; *RelativeId = 0;
RpcTryExcept { Status = SamrCreateUser2InDomain((SAMPR_HANDLE)DomainHandle, (PRPC_UNICODE_STRING)AccountName, AccountType, DesiredAccess, (SAMPR_HANDLE *)UserHandle, GrantedAccess, RelativeId);
} RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamCreateUserInDomain(IN SAM_HANDLE DomainHandle, IN PUNICODE_STRING AccountName, IN ACCESS_MASK DesiredAccess, OUT PSAM_HANDLE UserHandle, OUT PULONG RelativeId){ NTSTATUS Status;
TRACE("SamCreateUserInDomain(%p %p 0x%08x %p %p)\n", DomainHandle, AccountName, DesiredAccess, UserHandle, RelativeId);
*UserHandle = NULL; *RelativeId = 0;
RpcTryExcept { Status = SamrCreateUserInDomain((SAMPR_HANDLE)DomainHandle, (PRPC_UNICODE_STRING)AccountName, DesiredAccess, (SAMPR_HANDLE *)UserHandle, RelativeId); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamDeleteAlias(IN SAM_HANDLE AliasHandle){ SAMPR_HANDLE LocalAliasHandle; NTSTATUS Status;
TRACE("SamDeleteAlias(%p)\n", AliasHandle);
LocalAliasHandle = (SAMPR_HANDLE)AliasHandle;
if (LocalAliasHandle == NULL) return STATUS_INVALID_HANDLE;
RpcTryExcept { Status = SamrDeleteAlias(&LocalAliasHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamDeleteGroup(IN SAM_HANDLE GroupHandle){ SAMPR_HANDLE LocalGroupHandle; NTSTATUS Status;
TRACE("SamDeleteGroup(%p)\n", GroupHandle);
LocalGroupHandle = (SAMPR_HANDLE)GroupHandle;
if (LocalGroupHandle == NULL) return STATUS_INVALID_HANDLE;
RpcTryExcept { Status = SamrDeleteGroup(&LocalGroupHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamDeleteUser(IN SAM_HANDLE UserHandle){ SAMPR_HANDLE LocalUserHandle; NTSTATUS Status;
TRACE("SamDeleteUser(%p)\n", UserHandle);
LocalUserHandle = (SAMPR_HANDLE)UserHandle;
if (LocalUserHandle == NULL) return STATUS_INVALID_HANDLE;
RpcTryExcept { Status = SamrDeleteUser(&LocalUserHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamEnumerateAliasesInDomain(IN SAM_HANDLE DomainHandle, IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext, OUT PVOID *Buffer, IN ULONG PreferedMaximumLength, OUT PULONG CountReturned){ PSAMPR_ENUMERATION_BUFFER EnumBuffer = NULL; NTSTATUS Status;
TRACE("SamEnumerateAliasesInDomain(%p %p %p %lu %p)\n", DomainHandle, EnumerationContext, Buffer, PreferedMaximumLength, CountReturned);
if ((EnumerationContext == NULL) || (Buffer == NULL) || (CountReturned == NULL)) return STATUS_INVALID_PARAMETER;
*Buffer = NULL;
RpcTryExcept { Status = SamrEnumerateAliasesInDomain((SAMPR_HANDLE)DomainHandle, EnumerationContext, &EnumBuffer, PreferedMaximumLength, CountReturned);
if (EnumBuffer != NULL) { if (EnumBuffer->Buffer != NULL) { *Buffer = EnumBuffer->Buffer; }
midl_user_free(EnumBuffer); } } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamEnumerateDomainsInSamServer(IN SAM_HANDLE ServerHandle, IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext, OUT PVOID *Buffer, IN ULONG PreferedMaximumLength, OUT PULONG CountReturned){ PSAMPR_ENUMERATION_BUFFER EnumBuffer = NULL; NTSTATUS Status;
TRACE("SamEnumerateDomainsInSamServer(%p %p %p %lu %p)\n", ServerHandle, EnumerationContext, Buffer, PreferedMaximumLength, CountReturned);
if ((EnumerationContext == NULL) || (Buffer == NULL) || (CountReturned == NULL)) return STATUS_INVALID_PARAMETER;
*Buffer = NULL;
RpcTryExcept { Status = SamrEnumerateDomainsInSamServer((SAMPR_HANDLE)ServerHandle, EnumerationContext, &EnumBuffer, PreferedMaximumLength, CountReturned);
if (EnumBuffer != NULL) { if (EnumBuffer->Buffer != NULL) { *Buffer = EnumBuffer->Buffer; }
midl_user_free(EnumBuffer); } } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamEnumerateGroupsInDomain(IN SAM_HANDLE DomainHandle, IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext, IN PVOID *Buffer, IN ULONG PreferedMaximumLength, OUT PULONG CountReturned){ PSAMPR_ENUMERATION_BUFFER EnumBuffer = NULL; NTSTATUS Status;
TRACE("SamEnumerateGroupsInDomain(%p %p %p %lu %p)\n", DomainHandle, EnumerationContext, Buffer, PreferedMaximumLength, CountReturned);
if (EnumerationContext == NULL || Buffer == NULL || CountReturned == NULL) return STATUS_INVALID_PARAMETER;
*Buffer = NULL;
RpcTryExcept { Status = SamrEnumerateGroupsInDomain((SAMPR_HANDLE)DomainHandle, EnumerationContext, &EnumBuffer, PreferedMaximumLength, CountReturned); if (EnumBuffer != NULL) { if (EnumBuffer->Buffer != NULL) *Buffer = EnumBuffer->Buffer;
midl_user_free(EnumBuffer); } } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamEnumerateUsersInDomain(IN SAM_HANDLE DomainHandle, IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext, IN ULONG UserAccountControl, OUT PVOID *Buffer, IN ULONG PreferedMaximumLength, OUT PULONG CountReturned){ PSAMPR_ENUMERATION_BUFFER EnumBuffer = NULL; NTSTATUS Status;
TRACE("SamEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n", DomainHandle, EnumerationContext, UserAccountControl, Buffer, PreferedMaximumLength, CountReturned);
if (EnumerationContext == NULL || Buffer == NULL || CountReturned == NULL) return STATUS_INVALID_PARAMETER;
*Buffer = NULL;
RpcTryExcept { Status = SamrEnumerateUsersInDomain((SAMPR_HANDLE)DomainHandle, EnumerationContext, UserAccountControl, &EnumBuffer, PreferedMaximumLength, CountReturned); if (EnumBuffer != NULL) { if (EnumBuffer->Buffer != NULL) { *Buffer = EnumBuffer->Buffer; }
midl_user_free(EnumBuffer); }
} RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamFreeMemory(IN PVOID Buffer){ if (Buffer != NULL) midl_user_free(Buffer);
return STATUS_SUCCESS;}
NTSTATUSNTAPISamGetAliasMembership(IN SAM_HANDLE DomainHandle, IN ULONG PassedCount, IN PSID *Sids, OUT PULONG MembershipCount, OUT PULONG *Aliases){ SAMPR_PSID_ARRAY SidArray; SAMPR_ULONG_ARRAY Membership; NTSTATUS Status;
TRACE("SamAliasMembership(%p %lu %p %p %p)\n", DomainHandle, PassedCount, Sids, MembershipCount, Aliases);
if (Sids == NULL || MembershipCount == NULL || Aliases == NULL) return STATUS_INVALID_PARAMETER;
Membership.Element = NULL;
RpcTryExcept { SidArray.Count = PassedCount; SidArray.Sids = (PSAMPR_SID_INFORMATION)Sids;
Status = SamrGetAliasMembership((SAMPR_HANDLE)DomainHandle, &SidArray, &Membership); if (NT_SUCCESS(Status)) { *MembershipCount = Membership.Count; *Aliases = Membership.Element; } else { if (Membership.Element != NULL) midl_user_free(Membership.Element); } } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamGetCompatibilityMode(IN SAM_HANDLE ObjectHandle, OUT PULONG Mode){ TRACE("SamGetCompatibilityMode(%p %p)\n", ObjectHandle, Mode);
if (Mode == NULL) return STATUS_INVALID_PARAMETER;
*Mode = SAM_SID_COMPATIBILITY_ALL;
return STATUS_SUCCESS;}
NTSTATUSNTAPISamGetDisplayEnumerationIndex(IN SAM_HANDLE DomainHandle, IN DOMAIN_DISPLAY_INFORMATION DisplayInformation, IN PUNICODE_STRING Prefix, OUT PULONG Index){ NTSTATUS Status;
TRACE("SamGetDisplayEnumerationIndex(%p %lu %wZ %p)\n", DomainHandle, DisplayInformation, Prefix, Index);
if ((Prefix == NULL) || (Index == NULL)) return STATUS_INVALID_PARAMETER;
RpcTryExcept { Status = SamrGetDisplayEnumerationIndex2((SAMPR_HANDLE)DomainHandle, DisplayInformation, (PRPC_UNICODE_STRING)Prefix, Index); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamGetGroupsForUser(IN SAM_HANDLE UserHandle, OUT PGROUP_MEMBERSHIP *Groups, OUT PULONG MembershipCount){ PSAMPR_GET_GROUPS_BUFFER GroupsBuffer = NULL; NTSTATUS Status;
TRACE("SamGetGroupsForUser(%p %p %p)\n", UserHandle, Groups, MembershipCount);
RpcTryExcept { Status = SamrGetGroupsForUser((SAMPR_HANDLE)UserHandle, &GroupsBuffer); if (NT_SUCCESS(Status)) { *Groups = GroupsBuffer->Groups; *MembershipCount = GroupsBuffer->MembershipCount;
MIDL_user_free(GroupsBuffer); } else { if (GroupsBuffer != NULL) { if (GroupsBuffer->Groups != NULL) MIDL_user_free(GroupsBuffer->Groups);
MIDL_user_free(GroupsBuffer); } } } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamGetMembersInAlias(IN SAM_HANDLE AliasHandle, OUT PSID **MemberIds, OUT PULONG MemberCount){ SAMPR_PSID_ARRAY_OUT SidArray; NTSTATUS Status;
TRACE("SamGetMembersInAlias(%p %p %p)\n", AliasHandle, MemberIds, MemberCount);
if ((MemberIds == NULL) || (MemberCount == NULL)) return STATUS_INVALID_PARAMETER;
*MemberIds = NULL; *MemberCount = 0;
SidArray.Sids = NULL;
RpcTryExcept { Status = SamrGetMembersInAlias((SAMPR_HANDLE)AliasHandle, &SidArray); if (NT_SUCCESS(Status)) { *MemberCount = SidArray.Count; *MemberIds = (PSID *)SidArray.Sids; }
} RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamGetMembersInGroup(IN SAM_HANDLE GroupHandle, OUT PULONG *MemberIds, OUT PULONG *Attributes, OUT PULONG MemberCount){ PSAMPR_GET_MEMBERS_BUFFER MembersBuffer = NULL; NTSTATUS Status;
TRACE("SamGetMembersInGroup(%p %p %p %p)\n", GroupHandle, MemberIds, Attributes, MemberCount);
RpcTryExcept { Status = SamrGetMembersInGroup((SAMPR_HANDLE)GroupHandle, &MembersBuffer); if (NT_SUCCESS(Status)) { *MemberIds = MembersBuffer->Members; *Attributes = MembersBuffer->Attributes; *MemberCount = MembersBuffer->MemberCount;
MIDL_user_free(MembersBuffer); } else { if (MembersBuffer != NULL) { if (MembersBuffer->Members != NULL) MIDL_user_free(MembersBuffer->Members);
if (MembersBuffer->Attributes != NULL) MIDL_user_free(MembersBuffer->Attributes);
MIDL_user_free(MembersBuffer); } } } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle, IN PUNICODE_STRING Name, OUT PSID *DomainId){ NTSTATUS Status;
TRACE("SamLookupDomainInSamServer(%p %p %p)\n", ServerHandle, Name, DomainId);
RpcTryExcept { Status = SamrLookupDomainInSamServer((SAMPR_HANDLE)ServerHandle, (PRPC_UNICODE_STRING)Name, (PRPC_SID *)DomainId); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamLookupIdsInDomain(IN SAM_HANDLE DomainHandle, IN ULONG Count, IN PULONG RelativeIds, OUT PUNICODE_STRING *Names, OUT PSID_NAME_USE *Use OPTIONAL){ SAMPR_RETURNED_USTRING_ARRAY NamesBuffer = {0, NULL}; SAMPR_ULONG_ARRAY UseBuffer = {0, NULL}; ULONG i; NTSTATUS Status;
TRACE("SamLookupIdsInDomain(%p %lu %p %p %p)\n", DomainHandle, Count, RelativeIds, Names, Use);
*Names = NULL;
if (Use != NULL) *Use = NULL;
RpcTryExcept { Status = SamrLookupIdsInDomain((SAMPR_HANDLE)DomainHandle, Count, RelativeIds, &NamesBuffer, &UseBuffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
if (NT_SUCCESS(Status)) { *Names = midl_user_allocate(Count * sizeof(RPC_UNICODE_STRING)); if (*Names == NULL) { Status = STATUS_INSUFFICIENT_RESOURCES; goto done; }
for (i = 0; i < Count; i++) { (*Names)[i].Buffer = midl_user_allocate(NamesBuffer.Element[i].MaximumLength); if ((*Names)[i].Buffer == NULL) { Status = STATUS_INSUFFICIENT_RESOURCES; goto done; } }
for (i = 0; i < Count; i++) { (*Names)[i].Length = NamesBuffer.Element[i].Length; (*Names)[i].MaximumLength = NamesBuffer.Element[i].MaximumLength;
RtlCopyMemory((*Names)[i].Buffer, NamesBuffer.Element[i].Buffer, NamesBuffer.Element[i].Length); }
if (Use != NULL) { *Use = midl_user_allocate(Count * sizeof(SID_NAME_USE)); if (*Use == NULL) { Status = STATUS_INSUFFICIENT_RESOURCES; goto done; }
RtlCopyMemory(*Use, UseBuffer.Element, Count * sizeof(SID_NAME_USE)); } }
done: if (!NT_SUCCESS(Status)) { if (*Names != NULL) { for (i = 0; i < Count; i++) { if ((*Names)[i].Buffer != NULL) midl_user_free((*Names)[i].Buffer); }
midl_user_free(*Names); }
if (Use != NULL && *Use != NULL) midl_user_free(*Use); }
if (NamesBuffer.Element != NULL) { for (i = 0; i < NamesBuffer.Count; i++) { if (NamesBuffer.Element[i].Buffer != NULL) midl_user_free(NamesBuffer.Element[i].Buffer); }
midl_user_free(NamesBuffer.Element); }
if (UseBuffer.Element != NULL) midl_user_free(UseBuffer.Element);
return 0;}
NTSTATUSNTAPISamLookupNamesInDomain(IN SAM_HANDLE DomainHandle, IN ULONG Count, IN PUNICODE_STRING Names, OUT PULONG *RelativeIds, OUT PSID_NAME_USE *Use){ SAMPR_ULONG_ARRAY RidBuffer = {0, NULL}; SAMPR_ULONG_ARRAY UseBuffer = {0, NULL}; NTSTATUS Status;
TRACE("SamLookupNamesInDomain(%p %lu %p %p %p)\n", DomainHandle, Count, Names, RelativeIds, Use);
*RelativeIds = NULL; *Use = NULL;
RpcTryExcept { Status = SamrLookupNamesInDomain((SAMPR_HANDLE)DomainHandle, Count, (PRPC_UNICODE_STRING)Names, &RidBuffer, &UseBuffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
if (NT_SUCCESS(Status)) { *RelativeIds = midl_user_allocate(Count * sizeof(ULONG)); if (*RelativeIds == NULL) { Status = STATUS_INSUFFICIENT_RESOURCES; goto done; }
*Use = midl_user_allocate(Count * sizeof(SID_NAME_USE)); if (*Use == NULL) { Status = STATUS_INSUFFICIENT_RESOURCES; goto done; }
RtlCopyMemory(*RelativeIds, RidBuffer.Element, Count * sizeof(ULONG));
RtlCopyMemory(*Use, UseBuffer.Element, Count * sizeof(SID_NAME_USE)); }
done: if (!NT_SUCCESS(Status)) { if (*RelativeIds != NULL) midl_user_free(*RelativeIds);
if (*Use != NULL) midl_user_free(*Use); }
if (RidBuffer.Element != NULL) midl_user_free(RidBuffer.Element);
if (UseBuffer.Element != NULL) midl_user_free(UseBuffer.Element);
return Status;}
NTSTATUSNTAPISamOpenAlias(IN SAM_HANDLE DomainHandle, IN ACCESS_MASK DesiredAccess, IN ULONG AliasId, OUT PSAM_HANDLE AliasHandle){ NTSTATUS Status;
TRACE("SamOpenAlias(%p 0x%08x %lx %p)\n", DomainHandle, DesiredAccess, AliasId, AliasHandle);
RpcTryExcept { Status = SamrOpenAlias((SAMPR_HANDLE)DomainHandle, DesiredAccess, AliasId, (SAMPR_HANDLE *)AliasHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamOpenDomain(IN SAM_HANDLE ServerHandle, IN ACCESS_MASK DesiredAccess, IN PSID DomainId, OUT PSAM_HANDLE DomainHandle){ NTSTATUS Status;
TRACE("SamOpenDomain(%p 0x%08x %p %p)\n", ServerHandle, DesiredAccess, DomainId, DomainHandle);
RpcTryExcept { Status = SamrOpenDomain((SAMPR_HANDLE)ServerHandle, DesiredAccess, (PRPC_SID)DomainId, (SAMPR_HANDLE *)DomainHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamOpenGroup(IN SAM_HANDLE DomainHandle, IN ACCESS_MASK DesiredAccess, IN ULONG GroupId, OUT PSAM_HANDLE GroupHandle){ NTSTATUS Status;
TRACE("SamOpenGroup(%p 0x%08x %p %p)\n", DomainHandle, DesiredAccess, GroupId, GroupHandle);
RpcTryExcept { Status = SamrOpenGroup((SAMPR_HANDLE)DomainHandle, DesiredAccess, GroupId, (SAMPR_HANDLE *)GroupHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamOpenUser(IN SAM_HANDLE DomainHandle, IN ACCESS_MASK DesiredAccess, IN ULONG UserId, OUT PSAM_HANDLE UserHandle){ NTSTATUS Status;
TRACE("SamOpenUser(%p 0x%08x %lx %p)\n", DomainHandle, DesiredAccess, UserId, UserHandle);
RpcTryExcept { Status = SamrOpenUser((SAMPR_HANDLE)DomainHandle, DesiredAccess, UserId, (SAMPR_HANDLE *)UserHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamQueryDisplayInformation(IN SAM_HANDLE DomainHandle, IN DOMAIN_DISPLAY_INFORMATION DisplayInformation, IN ULONG Index, IN ULONG EntryCount, IN ULONG PreferredMaximumLength, OUT PULONG TotalAvailable, OUT PULONG TotalReturned, OUT PULONG ReturnedEntryCount, OUT PVOID *SortedBuffer){ SAMPR_DISPLAY_INFO_BUFFER LocalBuffer; NTSTATUS Status;
TRACE("SamQueryDisplayInformation(%p %lu %lu %lu %lu %p %p %p %p)\n", DomainHandle, DisplayInformation, Index, EntryCount, PreferredMaximumLength, TotalAvailable, TotalReturned, ReturnedEntryCount, SortedBuffer);
if ((TotalAvailable == NULL) || (TotalReturned == NULL) || (ReturnedEntryCount == NULL) || (SortedBuffer == NULL)) return STATUS_INVALID_PARAMETER;
RpcTryExcept { Status = SamrQueryDisplayInformation3((SAMPR_HANDLE)DomainHandle, DisplayInformation, Index, EntryCount, PreferredMaximumLength, TotalAvailable, TotalReturned, &LocalBuffer); if (NT_SUCCESS(Status)) { switch (DisplayInformation) { case DomainDisplayUser: *ReturnedEntryCount = LocalBuffer.UserInformation.EntriesRead; *SortedBuffer = LocalBuffer.UserInformation.Buffer; break;
case DomainDisplayMachine: *ReturnedEntryCount = LocalBuffer.MachineInformation.EntriesRead; *SortedBuffer = LocalBuffer.MachineInformation.Buffer; break;
case DomainDisplayGroup: *ReturnedEntryCount = LocalBuffer.GroupInformation.EntriesRead; *SortedBuffer = LocalBuffer.GroupInformation.Buffer; break;
case DomainDisplayOemUser: *ReturnedEntryCount = LocalBuffer.OemUserInformation.EntriesRead; *SortedBuffer = LocalBuffer.OemUserInformation.Buffer; break;
case DomainDisplayOemGroup: *ReturnedEntryCount = LocalBuffer.OemGroupInformation.EntriesRead; *SortedBuffer = LocalBuffer.OemGroupInformation.Buffer; break;
case DomainDisplayServer: /* FIXME */ break; } } else { *ReturnedEntryCount = 0; *SortedBuffer = NULL; } } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamQueryInformationAlias(IN SAM_HANDLE AliasHandle, IN ALIAS_INFORMATION_CLASS AliasInformationClass, OUT PVOID *Buffer){ NTSTATUS Status;
TRACE("SamQueryInformationAlias(%p %lu %p)\n", AliasHandle, AliasInformationClass, Buffer);
RpcTryExcept { Status = SamrQueryInformationAlias((SAMPR_HANDLE)AliasHandle, AliasInformationClass, (PSAMPR_ALIAS_INFO_BUFFER *)Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamQueryInformationDomain(IN SAM_HANDLE DomainHandle, IN DOMAIN_INFORMATION_CLASS DomainInformationClass, OUT PVOID *Buffer){ NTSTATUS Status;
TRACE("SamQueryInformationDomain(%p %lu %p)\n", DomainHandle, DomainInformationClass, Buffer);
RpcTryExcept { Status = SamrQueryInformationDomain((SAMPR_HANDLE)DomainHandle, DomainInformationClass, (PSAMPR_DOMAIN_INFO_BUFFER *)Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamQueryInformationGroup(IN SAM_HANDLE GroupHandle, IN GROUP_INFORMATION_CLASS GroupInformationClass, OUT PVOID *Buffer){ NTSTATUS Status;
TRACE("SamQueryInformationGroup(%p %lu %p)\n", GroupHandle, GroupInformationClass, Buffer);
RpcTryExcept { Status = SamrQueryInformationGroup((SAMPR_HANDLE)GroupHandle, GroupInformationClass, (PSAMPR_GROUP_INFO_BUFFER *)Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamQueryInformationUser(IN SAM_HANDLE UserHandle, IN USER_INFORMATION_CLASS UserInformationClass, OUT PVOID *Buffer){ NTSTATUS Status;
TRACE("SamQueryInformationUser(%p %lu %p)\n", UserHandle, UserInformationClass, Buffer);
RpcTryExcept { Status = SamrQueryInformationUser((SAMPR_HANDLE)UserHandle, UserInformationClass, (PSAMPR_USER_INFO_BUFFER *)Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamQuerySecurityObject(IN SAM_HANDLE ObjectHandle, IN SECURITY_INFORMATION SecurityInformation, OUT PSECURITY_DESCRIPTOR *SecurityDescriptor){ PSAMPR_SR_SECURITY_DESCRIPTOR SamSecurityDescriptor = NULL; NTSTATUS Status;
TRACE("SamQuerySecurityObject(%p %lu %p)\n", ObjectHandle, SecurityInformation, SecurityDescriptor);
*SecurityDescriptor = NULL;
RpcTryExcept { Status = SamrQuerySecurityObject((SAMPR_HANDLE)ObjectHandle, SecurityInformation, &SamSecurityDescriptor); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
TRACE("SamSecurityDescriptor: %p\n", SamSecurityDescriptor);
if (SamSecurityDescriptor != NULL) { TRACE("SamSecurityDescriptor->Length: %lu\n", SamSecurityDescriptor->Length); TRACE("SamSecurityDescriptor->SecurityDescriptor: %p\n", SamSecurityDescriptor->SecurityDescriptor);
*SecurityDescriptor = SamSecurityDescriptor->SecurityDescriptor;
midl_user_free(SamSecurityDescriptor); }
return Status;}
NTSTATUSNTAPISamRemoveMemberFromAlias(IN SAM_HANDLE AliasHandle, IN PSID MemberId){ NTSTATUS Status;
TRACE("SamRemoveMemberFromAlias(%p %ul)\n", AliasHandle, MemberId);
RpcTryExcept { Status = SamrRemoveMemberFromAlias((SAMPR_HANDLE)AliasHandle, MemberId); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamRemoveMemberFromForeignDomain(IN SAM_HANDLE DomainHandle, IN PSID MemberId){ NTSTATUS Status;
TRACE("SamRemoveMemberFromForeignDomain(%p %ul)\n", DomainHandle, MemberId);
RpcTryExcept { Status = SamrRemoveMemberFromForeignDomain((SAMPR_HANDLE)DomainHandle, MemberId); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamRemoveMemberFromGroup(IN SAM_HANDLE GroupHandle, IN ULONG MemberId){ NTSTATUS Status;
TRACE("SamRemoveMemberFromGroup(%p %ul)\n", GroupHandle, MemberId);
RpcTryExcept { Status = SamrRemoveMemberFromGroup((SAMPR_HANDLE)GroupHandle, MemberId); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamRemoveMultipleMembersFromAlias(IN SAM_HANDLE AliasHandle, IN PSID *MemberIds, IN ULONG MemberCount){ SAMPR_PSID_ARRAY Buffer; NTSTATUS Status;
TRACE("SamRemoveMultipleMembersFromAlias(%p %p %lu)\n", AliasHandle, MemberIds, MemberCount);
if (MemberIds == NULL) return STATUS_INVALID_PARAMETER_2;
Buffer.Count = MemberCount; Buffer.Sids = (PSAMPR_SID_INFORMATION)MemberIds;
RpcTryExcept { Status = SamrRemoveMultipleMembersFromAlias((SAMPR_HANDLE)AliasHandle, &Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamRidToSid(IN SAM_HANDLE ObjectHandle, IN ULONG Rid, OUT PSID *Sid){ UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED;}
NTSTATUSNTAPISamSetInformationAlias(IN SAM_HANDLE AliasHandle, IN ALIAS_INFORMATION_CLASS AliasInformationClass, IN PVOID Buffer){ NTSTATUS Status;
TRACE("SamSetInformationAlias(%p %lu %p)\n", AliasHandle, AliasInformationClass, Buffer);
RpcTryExcept { Status = SamrSetInformationAlias((SAMPR_HANDLE)AliasHandle, AliasInformationClass, Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamSetInformationDomain(IN SAM_HANDLE DomainHandle, IN DOMAIN_INFORMATION_CLASS DomainInformationClass, IN PVOID Buffer){ NTSTATUS Status;
TRACE("SamSetInformationDomain(%p %lu %p)\n", DomainHandle, DomainInformationClass, Buffer);
RpcTryExcept { Status = SamrSetInformationDomain((SAMPR_HANDLE)DomainHandle, DomainInformationClass, Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamSetInformationGroup(IN SAM_HANDLE GroupHandle, IN GROUP_INFORMATION_CLASS GroupInformationClass, IN PVOID Buffer){ NTSTATUS Status;
TRACE("SamSetInformationGroup(%p %lu %p)\n", GroupHandle, GroupInformationClass, Buffer);
RpcTryExcept { Status = SamrSetInformationGroup((SAMPR_HANDLE)GroupHandle, GroupInformationClass, Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamSetInformationUser(IN SAM_HANDLE UserHandle, IN USER_INFORMATION_CLASS UserInformationClass, IN PVOID Buffer){ PSAMPR_USER_SET_PASSWORD_INFORMATION PasswordBuffer; SAMPR_USER_INTERNAL1_INFORMATION Internal1Buffer; USER_ALL_INFORMATION InternalAllBuffer; OEM_STRING LmPwdString; CHAR LmPwdBuffer[15]; NTSTATUS Status;
TRACE("SamSetInformationUser(%p %lu %p)\n", UserHandle, UserInformationClass, Buffer);
if (UserInformationClass == UserSetPasswordInformation) { PasswordBuffer = (PSAMPR_USER_SET_PASSWORD_INFORMATION)Buffer;
Status = SampCheckPassword(UserHandle, (PUNICODE_STRING)&PasswordBuffer->Password); if (!NT_SUCCESS(Status)) { TRACE("SampCheckPassword failed (Status 0x%08lx)\n", Status); return Status; }
/* Calculate the NT hash value of the password */ Status = SystemFunction007((PUNICODE_STRING)&PasswordBuffer->Password, (LPBYTE)&Internal1Buffer.EncryptedNtOwfPassword); if (!NT_SUCCESS(Status)) { TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status); return Status; }
Internal1Buffer.NtPasswordPresent = TRUE; Internal1Buffer.LmPasswordPresent = FALSE;
/* Build the LM password */ LmPwdString.Length = 15; LmPwdString.MaximumLength = 15; LmPwdString.Buffer = LmPwdBuffer; ZeroMemory(LmPwdString.Buffer, LmPwdString.MaximumLength);
Status = RtlUpcaseUnicodeStringToOemString(&LmPwdString, (PUNICODE_STRING)&PasswordBuffer->Password, FALSE); if (NT_SUCCESS(Status)) { /* Calculate the LM hash value of the password */ Status = SystemFunction006(LmPwdString.Buffer, (LPSTR)&Internal1Buffer.EncryptedLmOwfPassword); if (NT_SUCCESS(Status)) Internal1Buffer.LmPasswordPresent = TRUE; }
Internal1Buffer.PasswordExpired = PasswordBuffer->PasswordExpired;
RpcTryExcept { Status = SamrSetInformationUser((SAMPR_HANDLE)UserHandle, UserInternal1Information, (PVOID)&Internal1Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
if (!NT_SUCCESS(Status)) { TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status); }
return Status; } else if (UserInformationClass == UserAllInformation) { RtlCopyMemory(&InternalAllBuffer, Buffer, sizeof(USER_ALL_INFORMATION));
if (InternalAllBuffer.WhichFields & (USER_ALL_LMPASSWORDPRESENT | USER_ALL_NTPASSWORDPRESENT)) { if (InternalAllBuffer.WhichFields & USER_ALL_OWFPASSWORD) { /* Check NT password hash */ if (InternalAllBuffer.WhichFields & USER_ALL_NTPASSWORDPRESENT) { if (InternalAllBuffer.NtPassword.Length != sizeof(ENCRYPTED_NT_OWF_PASSWORD)) return STATUS_INVALID_PARAMETER; }
/* Check LM password hash */ if (InternalAllBuffer.WhichFields & USER_ALL_LMPASSWORDPRESENT) { if (InternalAllBuffer.LmPassword.Length != sizeof(ENCRYPTED_LM_OWF_PASSWORD)) return STATUS_INVALID_PARAMETER; } } else { /* * Only allow the NT password to be set. * The LM password will be created here. */ if (InternalAllBuffer.WhichFields & USER_ALL_LMPASSWORDPRESENT) { TRACE("Do not try to set a clear text LM password!\n"); return STATUS_INVALID_PARAMETER; }
if (InternalAllBuffer.WhichFields & USER_ALL_NTPASSWORDPRESENT) { Status = SampCheckPassword(UserHandle, &InternalAllBuffer.NtPassword); if (!NT_SUCCESS(Status)) { TRACE("SampCheckPassword failed (Status 0x%08lx)\n", Status); return Status; }
/* Calculate the NT password hash */ Status = SystemFunction007((PUNICODE_STRING)&InternalAllBuffer.NtPassword, (LPBYTE)&Internal1Buffer.EncryptedNtOwfPassword); if (!NT_SUCCESS(Status)) { TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status); return Status; }
InternalAllBuffer.NtPasswordPresent = TRUE; InternalAllBuffer.LmPasswordPresent = FALSE;
InternalAllBuffer.NtPassword.Length = sizeof(ENCRYPTED_NT_OWF_PASSWORD); InternalAllBuffer.NtPassword.MaximumLength = sizeof(ENCRYPTED_NT_OWF_PASSWORD); InternalAllBuffer.NtPassword.Buffer = (LPWSTR)&Internal1Buffer.EncryptedNtOwfPassword;
/* Build the LM password */ LmPwdString.Length = 15; LmPwdString.MaximumLength = 15; LmPwdString.Buffer = LmPwdBuffer; ZeroMemory(LmPwdString.Buffer, LmPwdString.MaximumLength);
Status = RtlUpcaseUnicodeStringToOemString(&LmPwdString, (PUNICODE_STRING)&InternalAllBuffer.NtPassword, FALSE); if (NT_SUCCESS(Status)) { /* Calculate the LM password hash */ Status = SystemFunction006(LmPwdString.Buffer, (LPSTR)&Internal1Buffer.EncryptedLmOwfPassword); if (NT_SUCCESS(Status)) { InternalAllBuffer.WhichFields |= USER_ALL_LMPASSWORDPRESENT; InternalAllBuffer.LmPasswordPresent = TRUE;
InternalAllBuffer.LmPassword.Length = sizeof(ENCRYPTED_LM_OWF_PASSWORD); InternalAllBuffer.LmPassword.MaximumLength = sizeof(ENCRYPTED_LM_OWF_PASSWORD); InternalAllBuffer.LmPassword.Buffer = (LPWSTR)&Internal1Buffer.EncryptedLmOwfPassword; } } } } }
RpcTryExcept { Status = SamrSetInformationUser((SAMPR_HANDLE)UserHandle, UserAllInformation, (PVOID)&InternalAllBuffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
if (!NT_SUCCESS(Status)) { TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status); }
return Status; }
RpcTryExcept { Status = SamrSetInformationUser((SAMPR_HANDLE)UserHandle, UserInformationClass, Buffer); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamSetMemberAttributesOfGroup(IN SAM_HANDLE GroupHandle, IN ULONG MemberId, IN ULONG Attributes){ NTSTATUS Status;
TRACE("SamSetMemberAttributesOfGroup(%p %lu 0x%lx)\n", GroupHandle, MemberId, Attributes);
RpcTryExcept { Status = SamrSetMemberAttributesOfGroup((SAMPR_HANDLE)GroupHandle, MemberId, Attributes); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamSetSecurityObject(IN SAM_HANDLE ObjectHandle, IN SECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR SecurityDescriptor){ SAMPR_SR_SECURITY_DESCRIPTOR DescriptorToPass; ULONG Length; NTSTATUS Status;
TRACE("SamSetSecurityObject(%p %lu %p)\n", ObjectHandle, SecurityInformation, SecurityDescriptor);
/* Retrieve the length of the relative security descriptor */ Length = 0; Status = RtlMakeSelfRelativeSD(SecurityDescriptor, NULL, &Length); if (Status != STATUS_BUFFER_TOO_SMALL) return STATUS_INVALID_PARAMETER;
/* Allocate a buffer for the security descriptor */ DescriptorToPass.Length = Length; DescriptorToPass.SecurityDescriptor = MIDL_user_allocate(Length); if (DescriptorToPass.SecurityDescriptor == NULL) return STATUS_INSUFFICIENT_RESOURCES;
/* Convert the given security descriptor to a relative security descriptor */ Status = RtlMakeSelfRelativeSD(SecurityDescriptor, (PSECURITY_DESCRIPTOR)DescriptorToPass.SecurityDescriptor, &Length); if (!NT_SUCCESS(Status)) goto done;
RpcTryExcept { Status = SamrSetSecurityObject((SAMPR_HANDLE)ObjectHandle, SecurityInformation, &DescriptorToPass); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
done: if (DescriptorToPass.SecurityDescriptor != NULL) MIDL_user_free(DescriptorToPass.SecurityDescriptor);
return Status;}
NTSTATUSNTAPISamShutdownSamServer(IN SAM_HANDLE ServerHandle){ NTSTATUS Status;
TRACE("SamShutdownSamServer(%p)\n", ServerHandle);
RpcTryExcept { Status = SamrShutdownSamServer((SAMPR_HANDLE)ServerHandle); } RpcExcept(EXCEPTION_EXECUTE_HANDLER) { Status = I_RpcMapWin32Status(RpcExceptionCode()); } RpcEndExcept;
return Status;}
NTSTATUSNTAPISamTestPrivateFunctionsDomain( _In_ SAM_HANDLE DomainHandle){ TRACE("SamTestPrivateFunctionsDomain(%p)\n", DomainHandle); return STATUS_NOT_IMPLEMENTED;}
NTSTATUSNTAPISamTestPrivateFunctionsUser( _In_ SAM_HANDLE UserHandle){ TRACE("SamTestPrivateFunctionsUser(%p)\n", UserHandle); return STATUS_NOT_IMPLEMENTED;}
/* EOF */