typedef struct _ENUM_CONTEXT
{
+ LIST_ENTRY ListLink;
+ ULONG EnumHandle;
+
SAM_HANDLE ServerHandle;
SAM_HANDLE BuiltinDomainHandle;
SAM_HANDLE AccountDomainHandle;
+ PSID BuiltinDomainSid;
+ PSID AccountDomainSid;
SAM_ENUMERATE_HANDLE EnumerationContext;
PSAM_RID_ENUMERATION Buffer;
} ENUM_CONTEXT, *PENUM_CONTEXT;
+LIST_ENTRY g_EnumContextListHead;
+CRITICAL_SECTION g_EnumContextListLock;
+LONG g_EnumContextHandle = 0;
static
ULONG
static
NET_API_STATUS
-BuildUserInfoBuffer(SAM_HANDLE UserHandle,
- DWORD level,
- ULONG RelativeId,
- LPVOID *Buffer)
+GetUserPrivileges(
+ _In_ SAM_HANDLE BuiltinDomainHandle,
+ _In_ SAM_HANDLE UserHandle,
+ _In_ PSID AccountDomainSid,
+ _In_ ULONG RelativeId,
+ _Out_ PDWORD Priv,
+ _Out_ PDWORD AuthFlags)
+{
+ PGROUP_MEMBERSHIP GroupMembership = NULL;
+ ULONG GroupCount, SidCount, AliasCount, i;
+ PSID *SidArray = NULL;
+ PULONG AliasArray = NULL;
+ BOOL bAdmin = FALSE, bUser = FALSE;
+ NET_API_STATUS ApiStatus = NERR_Success;
+ NTSTATUS Status;
+
+ FIXME("GetUserPrivileges(%p)\n", UserHandle);
+
+ /* Get the users group memberships */
+ Status = SamGetGroupsForUser(UserHandle,
+ &GroupMembership,
+ &GroupCount);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamGetGroupsForUser() failed (Status 0x%08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ /* Allocate the SID array */
+ ApiStatus = NetApiBufferAllocate((GroupCount + 1) * sizeof(PSID),
+ (PVOID*)&SidArray);
+ if (ApiStatus != NERR_Success)
+ {
+ goto done;
+ }
+
+ /* Add the user to the SID array */
+ SidCount = 0;
+ ApiStatus = BuildSidFromSidAndRid(AccountDomainSid,
+ RelativeId,
+ &SidArray[0]);
+ if (ApiStatus != NERR_Success)
+ {
+ goto done;
+ }
+
+ SidCount++;
+
+ /* Add the groups to the SID array */
+ for (i = 0; i < GroupCount; i++)
+ {
+ ApiStatus = BuildSidFromSidAndRid(AccountDomainSid,
+ GroupMembership[i].RelativeId,
+ &SidArray[i + 1]);
+ if (ApiStatus != NERR_Success)
+ {
+ goto done;
+ }
+
+ SidCount++;
+ }
+
+ /* Get aliases for the user and his groups */
+ Status = SamGetAliasMembership(BuiltinDomainHandle,
+ SidCount,
+ SidArray,
+ &AliasCount,
+ &AliasArray);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamGetAliasMembership() failed (Status 0x%08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ *AuthFlags = 0;
+
+ /* Set the AuthFlags */
+ for (i = 0; i < AliasCount; i++)
+ {
+ switch (AliasArray[i])
+ {
+ case DOMAIN_ALIAS_RID_ADMINS:
+ bAdmin = TRUE;
+ break;
+
+ case DOMAIN_ALIAS_RID_USERS:
+ bUser = TRUE;
+ break;
+
+ case DOMAIN_ALIAS_RID_ACCOUNT_OPS:
+ *AuthFlags |= AF_OP_ACCOUNTS;
+ break;
+
+ case DOMAIN_ALIAS_RID_SYSTEM_OPS:
+ *AuthFlags |= AF_OP_SERVER;
+ break;
+
+ case DOMAIN_ALIAS_RID_PRINT_OPS:
+ *AuthFlags |= AF_OP_PRINT;
+ break;
+ }
+ }
+
+ /* Set the prvileges */
+ if (bAdmin)
+ {
+ *Priv = USER_PRIV_ADMIN;
+ }
+ else if (bUser)
+ {
+ *Priv = USER_PRIV_USER;
+ }
+ else
+ {
+ *Priv = USER_PRIV_GUEST;
+ }
+
+done:
+ if (AliasArray != NULL)
+ SamFreeMemory(AliasArray);
+
+ if (SidArray != NULL)
+ {
+ for (i = 0; i < SidCount; i++)
+ NetApiBufferFree(SidArray[i]);
+
+ NetApiBufferFree(SidArray);
+ }
+
+ if (GroupMembership != NULL)
+ SamFreeMemory(GroupMembership);
+
+ return ApiStatus;
+}
+
+
+static
+NET_API_STATUS
+BuildUserInfoBuffer(
+ _In_ SAM_HANDLE BuiltinDomainHandle,
+ _In_ SAM_HANDLE UserHandle,
+ _In_ PSID AccountDomainSid,
+ _In_ ULONG RelativeId,
+ _In_ DWORD level,
+ _Out_ LPVOID *Buffer)
{
UNICODE_STRING LogonServer = RTL_CONSTANT_STRING(L"\\\\*");
PUSER_ALL_INFORMATION UserInfo = NULL;
LPVOID LocalBuffer = NULL;
PACL Dacl = NULL;
+ DWORD Priv = 0, AuthFlags = 0;
PUSER_INFO_0 UserInfo0;
PUSER_INFO_1 UserInfo1;
PUSER_INFO_2 UserInfo2;
goto done;
}
+ if ((level == 1) || (level == 2) || (level == 3) ||
+ (level == 4) || (level == 11))
+ {
+ ApiStatus = GetUserPrivileges(BuiltinDomainHandle,
+ UserHandle,
+ AccountDomainSid,
+ RelativeId,
+ &Priv,
+ &AuthFlags);
+ if (ApiStatus != NERR_Success)
+ goto done;
+ }
+
switch (level)
{
case 0:
case 1:
Size = sizeof(USER_INFO_1) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->HomeDirectory.Length > 0)
- Size += UserInfo->HomeDirectory.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
-
- if (UserInfo->ScriptPath.Length > 0)
- Size += UserInfo->ScriptPath.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->HomeDirectory.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR) +
+ UserInfo->ScriptPath.Length + sizeof(WCHAR);
break;
case 2:
Size = sizeof(USER_INFO_2) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->HomeDirectory.Length > 0)
- Size += UserInfo->HomeDirectory.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
-
- if (UserInfo->ScriptPath.Length > 0)
- Size += UserInfo->ScriptPath.Length + sizeof(WCHAR);
-
- if (UserInfo->FullName.Length > 0)
- Size += UserInfo->FullName.Length + sizeof(WCHAR);
-
- if (UserInfo->UserComment.Length > 0)
- Size += UserInfo->UserComment.Length + sizeof(WCHAR);
-
- if (UserInfo->Parameters.Length > 0)
- Size += UserInfo->Parameters.Length + sizeof(WCHAR);
-
- if (UserInfo->WorkStations.Length > 0)
- Size += UserInfo->WorkStations.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->HomeDirectory.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR) +
+ UserInfo->ScriptPath.Length + sizeof(WCHAR) +
+ UserInfo->FullName.Length + sizeof(WCHAR) +
+ UserInfo->UserComment.Length + sizeof(WCHAR) +
+ UserInfo->Parameters.Length + sizeof(WCHAR) +
+ UserInfo->WorkStations.Length + sizeof(WCHAR) +
+ LogonServer.Length + sizeof(WCHAR);
if (UserInfo->LogonHours.UnitsPerWeek > 0)
Size += (((ULONG)UserInfo->LogonHours.UnitsPerWeek) + 7) / 8;
-
- if (LogonServer.Length > 0)
- Size += LogonServer.Length + sizeof(WCHAR);
break;
case 3:
Size = sizeof(USER_INFO_3) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->HomeDirectory.Length > 0)
- Size += UserInfo->HomeDirectory.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
-
- if (UserInfo->ScriptPath.Length > 0)
- Size += UserInfo->ScriptPath.Length + sizeof(WCHAR);
-
- if (UserInfo->FullName.Length > 0)
- Size += UserInfo->FullName.Length + sizeof(WCHAR);
-
- if (UserInfo->UserComment.Length > 0)
- Size += UserInfo->UserComment.Length + sizeof(WCHAR);
-
- if (UserInfo->Parameters.Length > 0)
- Size += UserInfo->Parameters.Length + sizeof(WCHAR);
-
- if (UserInfo->WorkStations.Length > 0)
- Size += UserInfo->WorkStations.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->HomeDirectory.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR) +
+ UserInfo->ScriptPath.Length + sizeof(WCHAR) +
+ UserInfo->FullName.Length + sizeof(WCHAR) +
+ UserInfo->UserComment.Length + sizeof(WCHAR) +
+ UserInfo->Parameters.Length + sizeof(WCHAR) +
+ UserInfo->WorkStations.Length + sizeof(WCHAR) +
+ LogonServer.Length + sizeof(WCHAR) +
+ UserInfo->ProfilePath.Length + sizeof(WCHAR) +
+ UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR);
if (UserInfo->LogonHours.UnitsPerWeek > 0)
Size += (((ULONG)UserInfo->LogonHours.UnitsPerWeek) + 7) / 8;
-
- if (LogonServer.Length > 0)
- Size += LogonServer.Length + sizeof(WCHAR);
-
- if (UserInfo->ProfilePath.Length > 0)
- Size += UserInfo->ProfilePath.Length + sizeof(WCHAR);
-
- if (UserInfo->HomeDirectoryDrive.Length > 0)
- Size += UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR);
break;
case 4:
Size = sizeof(USER_INFO_4) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->HomeDirectory.Length > 0)
- Size += UserInfo->HomeDirectory.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
-
- if (UserInfo->ScriptPath.Length > 0)
- Size += UserInfo->ScriptPath.Length + sizeof(WCHAR);
-
- if (UserInfo->FullName.Length > 0)
- Size += UserInfo->FullName.Length + sizeof(WCHAR);
-
- if (UserInfo->UserComment.Length > 0)
- Size += UserInfo->UserComment.Length + sizeof(WCHAR);
-
- if (UserInfo->Parameters.Length > 0)
- Size += UserInfo->Parameters.Length + sizeof(WCHAR);
-
- if (UserInfo->WorkStations.Length > 0)
- Size += UserInfo->WorkStations.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->HomeDirectory.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR) +
+ UserInfo->ScriptPath.Length + sizeof(WCHAR) +
+ UserInfo->FullName.Length + sizeof(WCHAR) +
+ UserInfo->UserComment.Length + sizeof(WCHAR) +
+ UserInfo->Parameters.Length + sizeof(WCHAR) +
+ UserInfo->WorkStations.Length + sizeof(WCHAR) +
+ LogonServer.Length + sizeof(WCHAR) +
+ UserInfo->ProfilePath.Length + sizeof(WCHAR) +
+ UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR);
if (UserInfo->LogonHours.UnitsPerWeek > 0)
Size += (((ULONG)UserInfo->LogonHours.UnitsPerWeek) + 7) / 8;
- if (LogonServer.Length > 0)
- Size += LogonServer.Length + sizeof(WCHAR);
-
- /* FIXME: usri4_user_sid */
-
- if (UserInfo->ProfilePath.Length > 0)
- Size += UserInfo->ProfilePath.Length + sizeof(WCHAR);
-
- if (UserInfo->HomeDirectoryDrive.Length > 0)
- Size += UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR);
+ Size += RtlLengthSid(AccountDomainSid) + sizeof(ULONG);
break;
case 10:
Size = sizeof(USER_INFO_10) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
-
- if (UserInfo->UserComment.Length > 0)
- Size += UserInfo->UserComment.Length + sizeof(WCHAR);
-
- if (UserInfo->FullName.Length > 0)
- Size += UserInfo->FullName.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR) +
+ UserInfo->UserComment.Length + sizeof(WCHAR) +
+ UserInfo->FullName.Length + sizeof(WCHAR);
break;
case 11:
Size = sizeof(USER_INFO_11) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
-
- if (UserInfo->UserComment.Length > 0)
- Size += UserInfo->UserComment.Length + sizeof(WCHAR);
-
- if (UserInfo->FullName.Length > 0)
- Size += UserInfo->FullName.Length + sizeof(WCHAR);
-
- if (UserInfo->HomeDirectory.Length > 0)
- Size += UserInfo->HomeDirectory.Length + sizeof(WCHAR);
-
- if (UserInfo->Parameters.Length > 0)
- Size += UserInfo->Parameters.Length + sizeof(WCHAR);
-
- if (LogonServer.Length > 0)
- Size += LogonServer.Length + sizeof(WCHAR);
-
- if (UserInfo->WorkStations.Length > 0)
- Size += UserInfo->WorkStations.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR) +
+ UserInfo->UserComment.Length + sizeof(WCHAR) +
+ UserInfo->FullName.Length + sizeof(WCHAR) +
+ UserInfo->HomeDirectory.Length + sizeof(WCHAR) +
+ UserInfo->Parameters.Length + sizeof(WCHAR) +
+ LogonServer.Length + sizeof(WCHAR) +
+ UserInfo->WorkStations.Length + sizeof(WCHAR);
if (UserInfo->LogonHours.UnitsPerWeek > 0)
Size += (((ULONG)UserInfo->LogonHours.UnitsPerWeek) + 7) / 8;
case 20:
Size = sizeof(USER_INFO_20) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->FullName.Length > 0)
- Size += UserInfo->FullName.Length + sizeof(WCHAR);
-
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->FullName.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR);
break;
case 23:
Size = sizeof(USER_INFO_23) +
- UserInfo->UserName.Length + sizeof(WCHAR);
-
- if (UserInfo->FullName.Length > 0)
- Size += UserInfo->FullName.Length + sizeof(WCHAR);
+ UserInfo->UserName.Length + sizeof(WCHAR) +
+ UserInfo->FullName.Length + sizeof(WCHAR) +
+ UserInfo->AdminComment.Length + sizeof(WCHAR);
- if (UserInfo->AdminComment.Length > 0)
- Size += UserInfo->AdminComment.Length + sizeof(WCHAR);
-
- /* FIXME: usri23_user_sid */
+ Size += RtlLengthSid(AccountDomainSid) + sizeof(ULONG);
break;
default:
UserInfo0 = (PUSER_INFO_0)LocalBuffer;
Ptr = (LPWSTR)((ULONG_PTR)UserInfo0 + sizeof(USER_INFO_0));
+
UserInfo0->usri0_name = Ptr;
memcpy(UserInfo0->usri0_name,
Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserName.Length + sizeof(WCHAR));
UserInfo1->usri1_password = NULL;
-
UserInfo1->usri1_password_age = GetPasswordAge(&UserInfo->PasswordLastSet);
- /* FIXME: UserInfo1->usri1_priv */
+ UserInfo1->usri1_priv = Priv;
- if (UserInfo->HomeDirectory.Length > 0)
- {
- UserInfo1->usri1_home_dir = Ptr;
-
- memcpy(UserInfo1->usri1_home_dir,
- UserInfo->HomeDirectory.Buffer,
- UserInfo->HomeDirectory.Length);
- UserInfo1->usri1_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- }
+ UserInfo1->usri1_home_dir = Ptr;
+ memcpy(UserInfo1->usri1_home_dir,
+ UserInfo->HomeDirectory.Buffer,
+ UserInfo->HomeDirectory.Length);
+ UserInfo1->usri1_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo1->usri1_comment = Ptr;
-
- memcpy(UserInfo1->usri1_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo1->usri1_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
+ UserInfo1->usri1_comment = Ptr;
+ memcpy(UserInfo1->usri1_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo1->usri1_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
UserInfo1->usri1_flags = GetAccountFlags(UserInfo->UserAccountControl,
Dacl);
- if (UserInfo->ScriptPath.Length > 0)
- {
- UserInfo1->usri1_script_path = Ptr;
-
- memcpy(UserInfo1->usri1_script_path,
- UserInfo->ScriptPath.Buffer,
- UserInfo->ScriptPath.Length);
- UserInfo1->usri1_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
- }
+ UserInfo1->usri1_script_path = Ptr;
+ memcpy(UserInfo1->usri1_script_path,
+ UserInfo->ScriptPath.Buffer,
+ UserInfo->ScriptPath.Length);
+ UserInfo1->usri1_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
break;
case 2:
Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserName.Length + sizeof(WCHAR));
+ UserInfo2->usri2_password = NULL;
UserInfo2->usri2_password_age = GetPasswordAge(&UserInfo->PasswordLastSet);
- /* FIXME: usri2_priv */
-
- if (UserInfo->HomeDirectory.Length > 0)
- {
- UserInfo2->usri2_home_dir = Ptr;
-
- memcpy(UserInfo2->usri2_home_dir,
- UserInfo->HomeDirectory.Buffer,
- UserInfo->HomeDirectory.Length);
- UserInfo2->usri2_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo2->usri2_comment = Ptr;
+ UserInfo2->usri2_priv = Priv;
- memcpy(UserInfo2->usri2_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo2->usri2_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ UserInfo2->usri2_home_dir = Ptr;
+ memcpy(UserInfo2->usri2_home_dir,
+ UserInfo->HomeDirectory.Buffer,
+ UserInfo->HomeDirectory.Length);
+ UserInfo2->usri2_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
+ UserInfo2->usri2_comment = Ptr;
+ memcpy(UserInfo2->usri2_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo2->usri2_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
UserInfo2->usri2_flags = GetAccountFlags(UserInfo->UserAccountControl,
Dacl);
- if (UserInfo->ScriptPath.Length > 0)
- {
- UserInfo2->usri2_script_path = Ptr;
-
- memcpy(UserInfo2->usri2_script_path,
- UserInfo->ScriptPath.Buffer,
- UserInfo->ScriptPath.Length);
- UserInfo2->usri2_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ScriptPath.Length + sizeof(WCHAR));
- }
-
- /* FIXME: usri2_auth_flags */
-
- if (UserInfo->FullName.Length > 0)
- {
- UserInfo2->usri2_full_name = Ptr;
-
- memcpy(UserInfo2->usri2_full_name,
- UserInfo->FullName.Buffer,
- UserInfo->FullName.Length);
- UserInfo2->usri2_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->UserComment.Length > 0)
- {
- UserInfo2->usri2_usr_comment = Ptr;
-
- memcpy(UserInfo2->usri2_usr_comment,
- UserInfo->UserComment.Buffer,
- UserInfo->UserComment.Length);
- UserInfo2->usri2_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->Parameters.Length > 0)
- {
- UserInfo2->usri2_parms = Ptr;
-
- memcpy(UserInfo2->usri2_parms,
- UserInfo->Parameters.Buffer,
- UserInfo->Parameters.Length);
- UserInfo2->usri2_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->WorkStations.Length > 0)
- {
- UserInfo2->usri2_workstations = Ptr;
-
- memcpy(UserInfo2->usri2_workstations,
- UserInfo->WorkStations.Buffer,
- UserInfo->WorkStations.Length);
- UserInfo2->usri2_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
- }
-
- RtlTimeToSecondsSince1970(&UserInfo->LastLogon,
- &UserInfo2->usri2_last_logon);
+ UserInfo2->usri2_script_path = Ptr;
+ memcpy(UserInfo2->usri2_script_path,
+ UserInfo->ScriptPath.Buffer,
+ UserInfo->ScriptPath.Length);
+ UserInfo2->usri2_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ScriptPath.Length + sizeof(WCHAR));
+
+ UserInfo2->usri2_auth_flags = AuthFlags;
+
+ UserInfo2->usri2_full_name = Ptr;
+ memcpy(UserInfo2->usri2_full_name,
+ UserInfo->FullName.Buffer,
+ UserInfo->FullName.Length);
+ UserInfo2->usri2_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
+
+ UserInfo2->usri2_usr_comment = Ptr;
+ memcpy(UserInfo2->usri2_usr_comment,
+ UserInfo->UserComment.Buffer,
+ UserInfo->UserComment.Length);
+ UserInfo2->usri2_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
+
+ UserInfo2->usri2_parms = Ptr;
+ memcpy(UserInfo2->usri2_parms,
+ UserInfo->Parameters.Buffer,
+ UserInfo->Parameters.Length);
+ UserInfo2->usri2_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
+
+ UserInfo2->usri2_workstations = Ptr;
+ memcpy(UserInfo2->usri2_workstations,
+ UserInfo->WorkStations.Buffer,
+ UserInfo->WorkStations.Length);
+ UserInfo2->usri2_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
+
+ if (UserInfo->LastLogon.QuadPart == 0)
+ UserInfo2->usri2_last_logon = 0;
+ else
+ RtlTimeToSecondsSince1970(&UserInfo->LastLogon,
+ &UserInfo2->usri2_last_logon);
- RtlTimeToSecondsSince1970(&UserInfo->LastLogoff,
- &UserInfo2->usri2_last_logoff);
+ if (UserInfo->LastLogoff.QuadPart == 0)
+ UserInfo2->usri2_last_logoff = 0;
+ else
+ RtlTimeToSecondsSince1970(&UserInfo->LastLogoff,
+ &UserInfo2->usri2_last_logoff);
- RtlTimeToSecondsSince1970(&UserInfo->AccountExpires,
- &UserInfo2->usri2_acct_expires);
+ if (UserInfo->AccountExpires.QuadPart == MAXLONGLONG)
+ UserInfo2->usri2_acct_expires = TIMEQ_FOREVER;
+ else
+ RtlTimeToSecondsSince1970(&UserInfo->AccountExpires,
+ &UserInfo2->usri2_acct_expires);
UserInfo2->usri2_max_storage = USER_MAXSTORAGE_UNLIMITED;
UserInfo2->usri2_units_per_week = UserInfo->LogonHours.UnitsPerWeek;
UserInfo2->usri2_bad_pw_count = UserInfo->BadPasswordCount;
UserInfo2->usri2_num_logons = UserInfo->LogonCount;
- if (LogonServer.Length > 0)
- {
- UserInfo2->usri2_logon_server = Ptr;
-
- memcpy(UserInfo2->usri2_logon_server,
- LogonServer.Buffer,
- LogonServer.Length);
- UserInfo2->usri2_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
- }
+ UserInfo2->usri2_logon_server = Ptr;
+ memcpy(UserInfo2->usri2_logon_server,
+ LogonServer.Buffer,
+ LogonServer.Length);
+ UserInfo2->usri2_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
UserInfo2->usri2_country_code = UserInfo->CountryCode;
UserInfo2->usri2_code_page = UserInfo->CodePage;
Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserName.Length + sizeof(WCHAR));
+ UserInfo3->usri3_password = NULL;
UserInfo3->usri3_password_age = GetPasswordAge(&UserInfo->PasswordLastSet);
- /* FIXME: usri3_priv */
+ UserInfo3->usri3_priv = Priv;
- if (UserInfo->HomeDirectory.Length > 0)
- {
- UserInfo3->usri3_home_dir = Ptr;
+ UserInfo3->usri3_home_dir = Ptr;
+ memcpy(UserInfo3->usri3_home_dir,
+ UserInfo->HomeDirectory.Buffer,
+ UserInfo->HomeDirectory.Length);
+ UserInfo3->usri3_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- memcpy(UserInfo3->usri3_home_dir,
- UserInfo->HomeDirectory.Buffer,
- UserInfo->HomeDirectory.Length);
- UserInfo3->usri3_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo3->usri3_comment = Ptr;
-
- memcpy(UserInfo3->usri3_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo3->usri3_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
+ UserInfo3->usri3_comment = Ptr;
+ memcpy(UserInfo3->usri3_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo3->usri3_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
UserInfo3->usri3_flags = GetAccountFlags(UserInfo->UserAccountControl,
Dacl);
- if (UserInfo->ScriptPath.Length > 0)
- {
- UserInfo3->usri3_script_path = Ptr;
-
- memcpy(UserInfo3->usri3_script_path,
- UserInfo->ScriptPath.Buffer,
- UserInfo->ScriptPath.Length);
- UserInfo3->usri3_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ScriptPath.Length + sizeof(WCHAR));
- }
-
- /* FIXME: usri3_auth_flags */
-
- if (UserInfo->FullName.Length > 0)
- {
- UserInfo3->usri3_full_name = Ptr;
-
- memcpy(UserInfo3->usri3_full_name,
- UserInfo->FullName.Buffer,
- UserInfo->FullName.Length);
- UserInfo3->usri3_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->UserComment.Length > 0)
- {
- UserInfo3->usri3_usr_comment = Ptr;
-
- memcpy(UserInfo3->usri3_usr_comment,
- UserInfo->UserComment.Buffer,
- UserInfo->UserComment.Length);
- UserInfo3->usri3_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->Parameters.Length > 0)
- {
- UserInfo3->usri3_parms = Ptr;
-
- memcpy(UserInfo3->usri3_parms,
- UserInfo->Parameters.Buffer,
- UserInfo->Parameters.Length);
- UserInfo3->usri3_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->WorkStations.Length > 0)
- {
- UserInfo3->usri3_workstations = Ptr;
-
- memcpy(UserInfo3->usri3_workstations,
- UserInfo->WorkStations.Buffer,
- UserInfo->WorkStations.Length);
- UserInfo3->usri3_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
- }
-
- RtlTimeToSecondsSince1970(&UserInfo->LastLogon,
- &UserInfo3->usri3_last_logon);
+ UserInfo3->usri3_script_path = Ptr;
+ memcpy(UserInfo3->usri3_script_path,
+ UserInfo->ScriptPath.Buffer,
+ UserInfo->ScriptPath.Length);
+ UserInfo3->usri3_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ScriptPath.Length + sizeof(WCHAR));
+
+ UserInfo3->usri3_auth_flags = AuthFlags;
+
+ UserInfo3->usri3_full_name = Ptr;
+ memcpy(UserInfo3->usri3_full_name,
+ UserInfo->FullName.Buffer,
+ UserInfo->FullName.Length);
+ UserInfo3->usri3_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
+
+ UserInfo3->usri3_usr_comment = Ptr;
+ memcpy(UserInfo3->usri3_usr_comment,
+ UserInfo->UserComment.Buffer,
+ UserInfo->UserComment.Length);
+ UserInfo3->usri3_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
+
+ UserInfo3->usri3_parms = Ptr;
+ memcpy(UserInfo3->usri3_parms,
+ UserInfo->Parameters.Buffer,
+ UserInfo->Parameters.Length);
+ UserInfo3->usri3_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
+
+ UserInfo3->usri3_workstations = Ptr;
+ memcpy(UserInfo3->usri3_workstations,
+ UserInfo->WorkStations.Buffer,
+ UserInfo->WorkStations.Length);
+ UserInfo3->usri3_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
+
+ if (UserInfo->LastLogon.QuadPart == 0)
+ UserInfo3->usri3_last_logon = 0;
+ else
+ RtlTimeToSecondsSince1970(&UserInfo->LastLogon,
+ &UserInfo3->usri3_last_logon);
- RtlTimeToSecondsSince1970(&UserInfo->LastLogoff,
- &UserInfo3->usri3_last_logoff);
+ if (UserInfo->LastLogoff.QuadPart == 0)
+ UserInfo3->usri3_last_logoff = 0;
+ else
+ RtlTimeToSecondsSince1970(&UserInfo->LastLogoff,
+ &UserInfo3->usri3_last_logoff);
- RtlTimeToSecondsSince1970(&UserInfo->AccountExpires,
- &UserInfo3->usri3_acct_expires);
+ if (UserInfo->AccountExpires.QuadPart == MAXLONGLONG)
+ UserInfo3->usri3_acct_expires = TIMEQ_FOREVER;
+ else
+ RtlTimeToSecondsSince1970(&UserInfo->AccountExpires,
+ &UserInfo3->usri3_acct_expires);
UserInfo3->usri3_max_storage = USER_MAXSTORAGE_UNLIMITED;
UserInfo3->usri3_units_per_week = UserInfo->LogonHours.UnitsPerWeek;
UserInfo3->usri3_bad_pw_count = UserInfo->BadPasswordCount;
UserInfo3->usri3_num_logons = UserInfo->LogonCount;
- if (LogonServer.Length > 0)
- {
- UserInfo3->usri3_logon_server = Ptr;
-
- memcpy(UserInfo3->usri3_logon_server,
- LogonServer.Buffer,
- LogonServer.Length);
- UserInfo3->usri3_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
- }
+ UserInfo3->usri3_logon_server = Ptr;
+ memcpy(UserInfo3->usri3_logon_server,
+ LogonServer.Buffer,
+ LogonServer.Length);
+ UserInfo3->usri3_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
UserInfo3->usri3_country_code = UserInfo->CountryCode;
UserInfo3->usri3_code_page = UserInfo->CodePage;
UserInfo3->usri3_user_id = RelativeId;
UserInfo3->usri3_primary_group_id = UserInfo->PrimaryGroupId;
- if (UserInfo->ProfilePath.Length > 0)
- {
- UserInfo3->usri3_profile = Ptr;
-
- memcpy(UserInfo3->usri3_profile,
- UserInfo->ProfilePath.Buffer,
- UserInfo->ProfilePath.Length);
- UserInfo3->usri3_profile[UserInfo->ProfilePath.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ProfilePath.Length + sizeof(WCHAR));
- }
+ UserInfo3->usri3_profile = Ptr;
+ memcpy(UserInfo3->usri3_profile,
+ UserInfo->ProfilePath.Buffer,
+ UserInfo->ProfilePath.Length);
+ UserInfo3->usri3_profile[UserInfo->ProfilePath.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ProfilePath.Length + sizeof(WCHAR));
- if (UserInfo->HomeDirectoryDrive.Length > 0)
- {
- UserInfo3->usri3_home_dir_drive = Ptr;
-
- memcpy(UserInfo3->usri3_home_dir_drive,
- UserInfo->HomeDirectoryDrive.Buffer,
- UserInfo->HomeDirectoryDrive.Length);
- UserInfo3->usri3_home_dir_drive[UserInfo->HomeDirectoryDrive.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR));
- }
+ UserInfo3->usri3_home_dir_drive = Ptr;
+ memcpy(UserInfo3->usri3_home_dir_drive,
+ UserInfo->HomeDirectoryDrive.Buffer,
+ UserInfo->HomeDirectoryDrive.Length);
+ UserInfo3->usri3_home_dir_drive[UserInfo->HomeDirectoryDrive.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR));
UserInfo3->usri3_password_expired = (UserInfo->UserAccountControl & USER_PASSWORD_EXPIRED);
break;
UserInfo4->usri4_password = NULL;
UserInfo4->usri4_password_age = GetPasswordAge(&UserInfo->PasswordLastSet);
- /* FIXME: usri4_priv */
-
- if (UserInfo->HomeDirectory.Length > 0)
- {
- UserInfo4->usri4_home_dir = Ptr;
-
- memcpy(UserInfo4->usri4_home_dir,
- UserInfo->HomeDirectory.Buffer,
- UserInfo->HomeDirectory.Length);
- UserInfo4->usri4_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo4->usri4_comment = Ptr;
+ UserInfo4->usri4_priv = Priv;
- memcpy(UserInfo4->usri4_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo4->usri4_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ UserInfo4->usri4_home_dir = Ptr;
+ memcpy(UserInfo4->usri4_home_dir,
+ UserInfo->HomeDirectory.Buffer,
+ UserInfo->HomeDirectory.Length);
+ UserInfo4->usri4_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
+ UserInfo4->usri4_comment = Ptr;
+ memcpy(UserInfo4->usri4_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo4->usri4_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
UserInfo4->usri4_flags = GetAccountFlags(UserInfo->UserAccountControl,
Dacl);
- if (UserInfo->ScriptPath.Length > 0)
- {
- UserInfo4->usri4_script_path = Ptr;
-
- memcpy(UserInfo4->usri4_script_path,
- UserInfo->ScriptPath.Buffer,
- UserInfo->ScriptPath.Length);
- UserInfo4->usri4_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ScriptPath.Length + sizeof(WCHAR));
- }
-
- /* FIXME: usri4_auth_flags */
-
- if (UserInfo->FullName.Length > 0)
- {
- UserInfo4->usri4_full_name = Ptr;
-
- memcpy(UserInfo4->usri4_full_name,
- UserInfo->FullName.Buffer,
- UserInfo->FullName.Length);
- UserInfo4->usri4_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->UserComment.Length > 0)
- {
- UserInfo4->usri4_usr_comment = Ptr;
-
- memcpy(UserInfo4->usri4_usr_comment,
- UserInfo->UserComment.Buffer,
- UserInfo->UserComment.Length);
- UserInfo4->usri4_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->Parameters.Length > 0)
- {
- UserInfo4->usri4_parms = Ptr;
-
- memcpy(UserInfo4->usri4_parms,
- UserInfo->Parameters.Buffer,
- UserInfo->Parameters.Length);
- UserInfo4->usri4_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->WorkStations.Length > 0)
- {
- UserInfo4->usri4_workstations = Ptr;
-
- memcpy(UserInfo4->usri4_workstations,
- UserInfo->WorkStations.Buffer,
- UserInfo->WorkStations.Length);
- UserInfo4->usri4_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
- }
-
- RtlTimeToSecondsSince1970(&UserInfo->LastLogon,
- &UserInfo4->usri4_last_logon);
+ UserInfo4->usri4_script_path = Ptr;
+ memcpy(UserInfo4->usri4_script_path,
+ UserInfo->ScriptPath.Buffer,
+ UserInfo->ScriptPath.Length);
+ UserInfo4->usri4_script_path[UserInfo->ScriptPath.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ScriptPath.Length + sizeof(WCHAR));
+
+ UserInfo4->usri4_auth_flags = AuthFlags;
+
+ UserInfo4->usri4_full_name = Ptr;
+ memcpy(UserInfo4->usri4_full_name,
+ UserInfo->FullName.Buffer,
+ UserInfo->FullName.Length);
+ UserInfo4->usri4_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
+
+ UserInfo4->usri4_usr_comment = Ptr;
+ memcpy(UserInfo4->usri4_usr_comment,
+ UserInfo->UserComment.Buffer,
+ UserInfo->UserComment.Length);
+ UserInfo4->usri4_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
+
+ UserInfo4->usri4_parms = Ptr;
+ memcpy(UserInfo4->usri4_parms,
+ UserInfo->Parameters.Buffer,
+ UserInfo->Parameters.Length);
+ UserInfo4->usri4_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
+
+ UserInfo4->usri4_workstations = Ptr;
+ memcpy(UserInfo4->usri4_workstations,
+ UserInfo->WorkStations.Buffer,
+ UserInfo->WorkStations.Length);
+ UserInfo4->usri4_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
+
+ if (UserInfo->LastLogon.QuadPart == 0)
+ UserInfo4->usri4_last_logon = 0;
+ else
+ RtlTimeToSecondsSince1970(&UserInfo->LastLogon,
+ &UserInfo4->usri4_last_logon);
- RtlTimeToSecondsSince1970(&UserInfo->LastLogoff,
- &UserInfo4->usri4_last_logoff);
+ if (UserInfo->LastLogoff.QuadPart == 0)
+ UserInfo4->usri4_last_logoff = 0;
+ else
+ RtlTimeToSecondsSince1970(&UserInfo->LastLogoff,
+ &UserInfo4->usri4_last_logoff);
- RtlTimeToSecondsSince1970(&UserInfo->AccountExpires,
- &UserInfo4->usri4_acct_expires);
+ if (UserInfo->AccountExpires.QuadPart == MAXLONGLONG)
+ UserInfo4->usri4_acct_expires = TIMEQ_FOREVER;
+ else
+ RtlTimeToSecondsSince1970(&UserInfo->AccountExpires,
+ &UserInfo4->usri4_acct_expires);
UserInfo4->usri4_max_storage = USER_MAXSTORAGE_UNLIMITED;
UserInfo4->usri4_units_per_week = UserInfo->LogonHours.UnitsPerWeek;
UserInfo4->usri4_bad_pw_count = UserInfo->BadPasswordCount;
UserInfo4->usri4_num_logons = UserInfo->LogonCount;
- if (LogonServer.Length > 0)
- {
- UserInfo4->usri4_logon_server = Ptr;
-
- memcpy(UserInfo4->usri4_logon_server,
- LogonServer.Buffer,
- LogonServer.Length);
- UserInfo4->usri4_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
- }
+ UserInfo4->usri4_logon_server = Ptr;
+ memcpy(UserInfo4->usri4_logon_server,
+ LogonServer.Buffer,
+ LogonServer.Length);
+ UserInfo4->usri4_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
UserInfo4->usri4_country_code = UserInfo->CountryCode;
UserInfo4->usri4_code_page = UserInfo->CodePage;
- /* FIXME: usri4_user_sid */
+ UserInfo4->usri4_user_sid = (PVOID)Ptr;
+ CopySidFromSidAndRid(UserInfo4->usri4_user_sid, AccountDomainSid, RelativeId);
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + RtlLengthSid(AccountDomainSid) + sizeof(ULONG));
UserInfo4->usri4_primary_group_id = UserInfo->PrimaryGroupId;
- if (UserInfo->ProfilePath.Length > 0)
- {
- UserInfo4->usri4_profile = Ptr;
+ UserInfo4->usri4_profile = Ptr;
+ memcpy(UserInfo4->usri4_profile,
+ UserInfo->ProfilePath.Buffer,
+ UserInfo->ProfilePath.Length);
+ UserInfo4->usri4_profile[UserInfo->ProfilePath.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ProfilePath.Length + sizeof(WCHAR));
- memcpy(UserInfo4->usri4_profile,
- UserInfo->ProfilePath.Buffer,
- UserInfo->ProfilePath.Length);
- UserInfo4->usri4_profile[UserInfo->ProfilePath.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->ProfilePath.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->HomeDirectoryDrive.Length > 0)
- {
- UserInfo4->usri4_home_dir_drive = Ptr;
-
- memcpy(UserInfo4->usri4_home_dir_drive,
- UserInfo->HomeDirectoryDrive.Buffer,
- UserInfo->HomeDirectoryDrive.Length);
- UserInfo4->usri4_home_dir_drive[UserInfo->HomeDirectoryDrive.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR));
- }
+ UserInfo4->usri4_home_dir_drive = Ptr;
+ memcpy(UserInfo4->usri4_home_dir_drive,
+ UserInfo->HomeDirectoryDrive.Buffer,
+ UserInfo->HomeDirectoryDrive.Length);
+ UserInfo4->usri4_home_dir_drive[UserInfo->HomeDirectoryDrive.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectoryDrive.Length + sizeof(WCHAR));
UserInfo4->usri4_password_expired = (UserInfo->UserAccountControl & USER_PASSWORD_EXPIRED);
break;
Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserName.Length + sizeof(WCHAR));
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo10->usri10_comment = Ptr;
-
- memcpy(UserInfo10->usri10_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo10->usri10_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->UserComment.Length > 0)
- {
- UserInfo10->usri10_usr_comment = Ptr;
-
- memcpy(UserInfo10->usri10_usr_comment,
- UserInfo->UserComment.Buffer,
- UserInfo->UserComment.Length);
- UserInfo10->usri10_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->FullName.Length > 0)
- {
- UserInfo10->usri10_full_name = Ptr;
-
- memcpy(UserInfo10->usri10_full_name,
- UserInfo->FullName.Buffer,
- UserInfo->FullName.Length);
- UserInfo10->usri10_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- }
+ UserInfo10->usri10_comment = Ptr;
+ memcpy(UserInfo10->usri10_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo10->usri10_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
+
+ UserInfo10->usri10_usr_comment = Ptr;
+ memcpy(UserInfo10->usri10_usr_comment,
+ UserInfo->UserComment.Buffer,
+ UserInfo->UserComment.Length);
+ UserInfo10->usri10_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
+
+ UserInfo10->usri10_full_name = Ptr;
+ memcpy(UserInfo10->usri10_full_name,
+ UserInfo->FullName.Buffer,
+ UserInfo->FullName.Length);
+ UserInfo10->usri10_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
break;
case 11:
Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserName.Length + sizeof(WCHAR));
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo11->usri11_comment = Ptr;
-
- memcpy(UserInfo11->usri11_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo11->usri11_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->UserComment.Length > 0)
- {
- UserInfo11->usri11_usr_comment = Ptr;
-
- memcpy(UserInfo11->usri11_usr_comment,
- UserInfo->UserComment.Buffer,
- UserInfo->UserComment.Length);
- UserInfo11->usri11_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->FullName.Length > 0)
- {
- UserInfo11->usri11_full_name = Ptr;
-
- memcpy(UserInfo11->usri11_full_name,
- UserInfo->FullName.Buffer,
- UserInfo->FullName.Length);
- UserInfo11->usri11_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- }
-
- /* FIXME: usri11_priv */
- /* FIXME: usri11_auth_flags */
+ UserInfo11->usri11_comment = Ptr;
+ memcpy(UserInfo11->usri11_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo11->usri11_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
+
+ UserInfo11->usri11_usr_comment = Ptr;
+ memcpy(UserInfo11->usri11_usr_comment,
+ UserInfo->UserComment.Buffer,
+ UserInfo->UserComment.Length);
+ UserInfo11->usri11_usr_comment[UserInfo->UserComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserComment.Length + sizeof(WCHAR));
+
+ UserInfo11->usri11_full_name = Ptr;
+ memcpy(UserInfo11->usri11_full_name,
+ UserInfo->FullName.Buffer,
+ UserInfo->FullName.Length);
+ UserInfo11->usri11_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
+
+ UserInfo11->usri11_priv = Priv;
+ UserInfo11->usri11_auth_flags = AuthFlags;
UserInfo11->usri11_password_age = GetPasswordAge(&UserInfo->PasswordLastSet);
- if (UserInfo->HomeDirectory.Length > 0)
- {
- UserInfo11->usri11_home_dir = Ptr;
-
- memcpy(UserInfo11->usri11_home_dir,
- UserInfo->HomeDirectory.Buffer,
- UserInfo->HomeDirectory.Length);
- UserInfo11->usri11_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->Parameters.Length > 0)
- {
- UserInfo11->usri11_parms = Ptr;
-
- memcpy(UserInfo11->usri11_parms,
- UserInfo->Parameters.Buffer,
- UserInfo->Parameters.Length);
- UserInfo11->usri11_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
- }
-
- RtlTimeToSecondsSince1970(&UserInfo->LastLogon,
- &UserInfo11->usri11_last_logon);
+ UserInfo11->usri11_home_dir = Ptr;
+ memcpy(UserInfo11->usri11_home_dir,
+ UserInfo->HomeDirectory.Buffer,
+ UserInfo->HomeDirectory.Length);
+ UserInfo11->usri11_home_dir[UserInfo->HomeDirectory.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->HomeDirectory.Length + sizeof(WCHAR));
+
+ UserInfo11->usri11_parms = Ptr;
+ memcpy(UserInfo11->usri11_parms,
+ UserInfo->Parameters.Buffer,
+ UserInfo->Parameters.Length);
+ UserInfo11->usri11_parms[UserInfo->Parameters.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->Parameters.Length + sizeof(WCHAR));
+
+ if (UserInfo->LastLogon.QuadPart == 0)
+ UserInfo11->usri11_last_logon = 0;
+ else
+ RtlTimeToSecondsSince1970(&UserInfo->LastLogon,
+ &UserInfo11->usri11_last_logon);
- RtlTimeToSecondsSince1970(&UserInfo->LastLogoff,
- &UserInfo11->usri11_last_logoff);
+ if (UserInfo->LastLogoff.QuadPart == 0)
+ UserInfo11->usri11_last_logoff = 0;
+ else
+ RtlTimeToSecondsSince1970(&UserInfo->LastLogoff,
+ &UserInfo11->usri11_last_logoff);
UserInfo11->usri11_bad_pw_count = UserInfo->BadPasswordCount;
UserInfo11->usri11_num_logons = UserInfo->LogonCount;
- if (LogonServer.Length > 0)
- {
- UserInfo11->usri11_logon_server = Ptr;
-
- memcpy(UserInfo11->usri11_logon_server,
- LogonServer.Buffer,
- LogonServer.Length);
- UserInfo11->usri11_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
- }
+ UserInfo11->usri11_logon_server = Ptr;
+ memcpy(UserInfo11->usri11_logon_server,
+ LogonServer.Buffer,
+ LogonServer.Length);
+ UserInfo11->usri11_logon_server[LogonServer.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + LogonServer.Length + sizeof(WCHAR));
UserInfo11->usri11_country_code = UserInfo->CountryCode;
- if (UserInfo->WorkStations.Length > 0)
- {
- UserInfo11->usri11_workstations = Ptr;
-
- memcpy(UserInfo11->usri11_workstations,
- UserInfo->WorkStations.Buffer,
- UserInfo->WorkStations.Length);
- UserInfo11->usri11_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
- }
+ UserInfo11->usri11_workstations = Ptr;
+ memcpy(UserInfo11->usri11_workstations,
+ UserInfo->WorkStations.Buffer,
+ UserInfo->WorkStations.Length);
+ UserInfo11->usri11_workstations[UserInfo->WorkStations.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->WorkStations.Length + sizeof(WCHAR));
UserInfo11->usri11_max_storage = USER_MAXSTORAGE_UNLIMITED;
UserInfo11->usri11_units_per_week = UserInfo->LogonHours.UnitsPerWeek;
Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserName.Length + sizeof(WCHAR));
- if (UserInfo->FullName.Length > 0)
- {
- UserInfo20->usri20_full_name = Ptr;
-
- memcpy(UserInfo20->usri20_full_name,
- UserInfo->FullName.Buffer,
- UserInfo->FullName.Length);
- UserInfo20->usri20_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- }
+ UserInfo20->usri20_full_name = Ptr;
+ memcpy(UserInfo20->usri20_full_name,
+ UserInfo->FullName.Buffer,
+ UserInfo->FullName.Length);
+ UserInfo20->usri20_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo20->usri20_comment = Ptr;
-
- memcpy(UserInfo20->usri20_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo20->usri20_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
+ UserInfo20->usri20_comment = Ptr;
+ memcpy(UserInfo20->usri20_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo20->usri20_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
UserInfo20->usri20_flags = GetAccountFlags(UserInfo->UserAccountControl,
Dacl);
Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->UserName.Length + sizeof(WCHAR));
- if (UserInfo->FullName.Length > 0)
- {
- UserInfo23->usri23_full_name = Ptr;
-
- memcpy(UserInfo23->usri23_full_name,
- UserInfo->FullName.Buffer,
- UserInfo->FullName.Length);
- UserInfo23->usri23_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
-
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- }
-
- if (UserInfo->AdminComment.Length > 0)
- {
- UserInfo23->usri23_comment = Ptr;
-
- memcpy(UserInfo23->usri23_comment,
- UserInfo->AdminComment.Buffer,
- UserInfo->AdminComment.Length);
- UserInfo23->usri23_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ UserInfo23->usri23_full_name = Ptr;
+ memcpy(UserInfo23->usri23_full_name,
+ UserInfo->FullName.Buffer,
+ UserInfo->FullName.Length);
+ UserInfo23->usri23_full_name[UserInfo->FullName.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->FullName.Length + sizeof(WCHAR));
- Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
- }
+ UserInfo23->usri23_comment = Ptr;
+ memcpy(UserInfo23->usri23_comment,
+ UserInfo->AdminComment.Buffer,
+ UserInfo->AdminComment.Length);
+ UserInfo23->usri23_comment[UserInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + UserInfo->AdminComment.Length + sizeof(WCHAR));
UserInfo23->usri23_flags = GetAccountFlags(UserInfo->UserAccountControl,
Dacl);
- /* FIXME: usri23_user_sid */
- break;
+ UserInfo23->usri23_user_sid = (PVOID)Ptr;
+ CopySidFromSidAndRid(UserInfo23->usri23_user_sid, AccountDomainSid, RelativeId);
+ Ptr = (LPWSTR)((ULONG_PTR)Ptr + RtlLengthSid(AccountDomainSid) + sizeof(ULONG));
+ break;
}
done:
NET_API_STATUS
SetUserInfo(SAM_HANDLE UserHandle,
LPBYTE UserInfo,
- DWORD Level)
+ DWORD Level,
+ PDWORD parm_err)
{
USER_ALL_INFORMATION UserAllInfo;
PUSER_INFO_0 UserInfo0;
PUSER_INFO_1013 UserInfo1013;
PUSER_INFO_1014 UserInfo1014;
PUSER_INFO_1017 UserInfo1017;
- PUSER_INFO_1018 UserInfo1018;
+ PUSER_INFO_1020 UserInfo1020;
PUSER_INFO_1024 UserInfo1024;
PUSER_INFO_1025 UserInfo1025;
PUSER_INFO_1051 UserInfo1051;
if (UserInfo2->usri2_acct_expires == TIMEQ_FOREVER)
{
- UserAllInfo.AccountExpires.LowPart = 0;
- UserAllInfo.AccountExpires.HighPart = 0;
+ UserAllInfo.AccountExpires.QuadPart = MAXLONGLONG;
}
else
{
// usri2_max_storage ignored
-// UserInfo2->usri2_units_per_week;
-// UserInfo2->usri2_logon_hours;
+ if (UserInfo2->usri2_units_per_week > USHRT_MAX)
+ {
+ if (parm_err != NULL)
+ *parm_err = USER_UNITS_PER_WEEK_PARMNUM;
+ ApiStatus = ERROR_INVALID_PARAMETER;
+ break;
+ }
+
+ UserAllInfo.LogonHours.UnitsPerWeek = UserInfo2->usri2_units_per_week;
+ UserAllInfo.LogonHours.LogonHours = UserInfo2->usri2_logon_hours;
+ UserAllInfo.WhichFields |= USER_ALL_LOGONHOURS;
// usri2_bad_pw_count ignored
// usri2_num_logons ignored
if (UserInfo3->usri3_acct_expires == TIMEQ_FOREVER)
{
- UserAllInfo.AccountExpires.LowPart = 0;
- UserAllInfo.AccountExpires.HighPart = 0;
+ UserAllInfo.AccountExpires.QuadPart = MAXLONGLONG;
}
else
{
// usri3_max_storage ignored
-// UserInfo3->usri3_units_per_week;
-// UserInfo3->usri3_logon_hours;
+ if (UserInfo3->usri3_units_per_week > USHRT_MAX)
+ {
+ if (parm_err != NULL)
+ *parm_err = USER_UNITS_PER_WEEK_PARMNUM;
+ ApiStatus = ERROR_INVALID_PARAMETER;
+ break;
+ }
+
+ UserAllInfo.LogonHours.UnitsPerWeek = UserInfo3->usri3_units_per_week;
+ UserAllInfo.LogonHours.LogonHours = UserInfo3->usri3_logon_hours;
+ UserAllInfo.WhichFields |= USER_ALL_LOGONHOURS;
// usri3_bad_pw_count ignored
// usri3_num_logons ignored
if (UserInfo4->usri4_acct_expires == TIMEQ_FOREVER)
{
- UserAllInfo.AccountExpires.LowPart = 0;
- UserAllInfo.AccountExpires.HighPart = 0;
+ UserAllInfo.AccountExpires.QuadPart = MAXLONGLONG;
}
else
{
// usri4_max_storage ignored
-// UserInfo4->usri4_units_per_week;
-// UserInfo4->usri4_logon_hours;
+ if (UserInfo4->usri4_units_per_week > USHRT_MAX)
+ {
+ if (parm_err != NULL)
+ *parm_err = USER_UNITS_PER_WEEK_PARMNUM;
+ ApiStatus = ERROR_INVALID_PARAMETER;
+ break;
+ }
+
+ UserAllInfo.LogonHours.UnitsPerWeek = UserInfo4->usri4_units_per_week;
+ UserAllInfo.LogonHours.LogonHours = UserInfo4->usri4_logon_hours;
+ UserAllInfo.WhichFields |= USER_ALL_LOGONHOURS;
// usri4_bad_pw_count ignored
// usri4_num_logons ignored
if (UserInfo22->usri22_acct_expires == TIMEQ_FOREVER)
{
- UserAllInfo.AccountExpires.LowPart = 0;
- UserAllInfo.AccountExpires.HighPart = 0;
+ UserAllInfo.AccountExpires.QuadPart = MAXLONGLONG;
}
else
{
// usri22_max_storage ignored
-// UserInfo22->usri22_units_per_week;
-// UserInfo22->usri22_logon_hours;
+ if (UserInfo22->usri22_units_per_week > USHRT_MAX)
+ {
+ if (parm_err != NULL)
+ *parm_err = USER_UNITS_PER_WEEK_PARMNUM;
+ ApiStatus = ERROR_INVALID_PARAMETER;
+ break;
+ }
+
+ UserAllInfo.LogonHours.UnitsPerWeek = UserInfo22->usri22_units_per_week;
+ UserAllInfo.LogonHours.LogonHours = UserInfo22->usri22_logon_hours;
+ UserAllInfo.WhichFields |= USER_ALL_LOGONHOURS;
// usri22_bad_pw_count ignored
// usri22_num_logons ignored
if (UserInfo1017->usri1017_acct_expires == TIMEQ_FOREVER)
{
- UserAllInfo.AccountExpires.LowPart = 0;
- UserAllInfo.AccountExpires.HighPart = 0;
+ UserAllInfo.AccountExpires.QuadPart = MAXLONGLONG;
}
else
{
break;
case 1018:
- UserInfo1018 = (PUSER_INFO_1018)UserInfo;
+ // usri1018_max_storage ignored
+ break;
+
+ case 1020:
+ UserInfo1020 = (PUSER_INFO_1020)UserInfo;
- if (UserInfo1018->usri1018_max_storage != USER_MAXSTORAGE_UNLIMITED)
+ if (UserInfo1020->usri1020_units_per_week > USHRT_MAX)
{
- // FIXME: Report error
- return ERROR_INVALID_PARAMETER;
+ if (parm_err != NULL)
+ *parm_err = USER_UNITS_PER_WEEK_PARMNUM;
+ ApiStatus = ERROR_INVALID_PARAMETER;
+ break;
}
- break;
-// case 1020:
-// break;
+ UserAllInfo.LogonHours.UnitsPerWeek = UserInfo1020->usri1020_units_per_week;
+ UserAllInfo.LogonHours.LogonHours = UserInfo1020->usri1020_logon_hours;
+ UserAllInfo.WhichFields |= USER_ALL_LOGONHOURS;
+ break;
case 1024:
UserInfo1024 = (PUSER_INFO_1024)UserInfo;
UserAllInfo.WhichFields |= USER_ALL_HOMEDIRECTORYDRIVE;
}
break;
-
- default:
- ERR("Unsupported level %lu!\n", Level);
- return ERROR_INVALID_PARAMETER;
}
+ if (ApiStatus != NERR_Success)
+ goto done;
+
Status = SamSetInformationUser(UserHandle,
UserAllInformation,
&UserAllInfo);
TRACE("(%s, %d, %p, %p)\n", debugstr_w(servername), level, bufptr, parm_err);
+ if (parm_err != NULL)
+ *parm_err = PARM_ERROR_NONE;
+
/* Check the info level */
switch (level)
{
/* Set user information */
ApiStatus = SetUserInfo(UserHandle,
bufptr,
- level);
+ level,
+ parm_err);
if (ApiStatus != NERR_Success)
{
ERR("SetUserInfo failed (Status %lu)\n", ApiStatus);
goto done;
}
+ /* A successful delete invalidates the handle */
+ UserHandle = NULL;
+
done:
if (UserHandle != NULL)
SamCloseHandle(UserHandle);
return ApiStatus;
}
+static
+NET_API_STATUS
+AllocateEnumContext(
+ PENUM_CONTEXT *AllocatedEnumContext)
+{
+ NET_API_STATUS ApiStatus;
+ PENUM_CONTEXT EnumContext;
+
+ /* Allocate the context structure */
+ ApiStatus = NetApiBufferAllocate(sizeof(ENUM_CONTEXT), (PVOID*)&EnumContext);
+ if (ApiStatus != NERR_Success)
+ return ApiStatus;
+
+ /* Initialize the fields */
+ EnumContext->EnumerationContext = 0;
+ EnumContext->Buffer = NULL;
+ EnumContext->Count = 0;
+ EnumContext->Index = 0;
+ EnumContext->BuiltinDone = FALSE;
+
+ /* Set a "unique" handle */
+ EnumContext->EnumHandle = InterlockedIncrement(&g_EnumContextHandle);
+ if (EnumContext->EnumHandle == 0)
+ {
+ EnumContext->EnumHandle = InterlockedIncrement(&g_EnumContextHandle);
+ }
+
+ /* Insert the context in the list */
+ EnterCriticalSection(&g_EnumContextListLock);
+ InsertTailList(&g_EnumContextListHead, &EnumContext->ListLink);
+ LeaveCriticalSection(&g_EnumContextListLock);
+
+ *AllocatedEnumContext = EnumContext;
+ return NERR_Success;
+}
+
+static
+VOID
+FreeEnumContext(
+ PENUM_CONTEXT EnumContext)
+
+{
+ /* Remove the context from the list */
+ EnterCriticalSection(&g_EnumContextListLock);
+ RemoveEntryList(&EnumContext->ListLink);
+ LeaveCriticalSection(&g_EnumContextListLock);
+
+ /* Free it */
+ NetApiBufferFree(EnumContext);
+}
+
+static
+PENUM_CONTEXT
+LookupEnumContext(
+ SAM_ENUMERATE_HANDLE EnumerationHandle)
+{
+ PENUM_CONTEXT FoundEnumContext = NULL;
+ PLIST_ENTRY ListEntry;
+
+ /* Acquire the list lock */
+ EnterCriticalSection(&g_EnumContextListLock);
+
+ /* Search the list for the handle */
+ for (ListEntry = g_EnumContextListHead.Flink;
+ ListEntry != &g_EnumContextListHead;
+ ListEntry = ListEntry->Flink)
+ {
+ PENUM_CONTEXT EnumContext = CONTAINING_RECORD(ListEntry, ENUM_CONTEXT, ListLink);
+ if (EnumContext->EnumHandle == EnumerationHandle)
+ {
+ FoundEnumContext = EnumContext;
+ break;
+ }
+ }
+
+ /* Release the list lock */
+ LeaveCriticalSection(&g_EnumContextListLock);
+
+ return FoundEnumContext;
+}
/************************************************************
* NetUserEnum (NETAPI32.@)
LPVOID Buffer = NULL;
ULONG i;
SAM_HANDLE UserHandle = NULL;
+ ACCESS_MASK DesiredAccess;
NET_API_STATUS ApiStatus = NERR_Success;
NTSTATUS Status = STATUS_SUCCESS;
if (resume_handle != NULL && *resume_handle != 0)
{
- EnumContext = (PENUM_CONTEXT)*resume_handle;
+ EnumContext = LookupEnumContext(*resume_handle);
}
else
{
- ApiStatus = NetApiBufferAllocate(sizeof(ENUM_CONTEXT), (PVOID*)&EnumContext);
+ ApiStatus = AllocateEnumContext(&EnumContext);
if (ApiStatus != NERR_Success)
goto done;
- EnumContext->EnumerationContext = 0;
- EnumContext->Buffer = NULL;
- EnumContext->Count = 0;
- EnumContext->Index = 0;
- EnumContext->BuiltinDone = FALSE;
-
Status = SamConnect((servername != NULL) ? &ServerName : NULL,
&EnumContext->ServerHandle,
SAM_SERVER_CONNECT | SAM_SERVER_LOOKUP_DOMAIN,
goto done;
}
- Status = OpenAccountDomain(EnumContext->ServerHandle,
- (servername != NULL) ? &ServerName : NULL,
- DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP,
- &EnumContext->AccountDomainHandle);
+ /* Get the Account Domain SID */
+ Status = GetAccountDomainSid((servername != NULL) ? &ServerName : NULL,
+ &EnumContext->AccountDomainSid);
if (!NT_SUCCESS(Status))
{
- ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
+ ERR("GetAccountDomainSid failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ /* Open the Account Domain */
+ Status = SamOpenDomain(EnumContext->ServerHandle,
+ DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP,
+ EnumContext->AccountDomainSid,
+ &EnumContext->AccountDomainHandle);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamOpenDomain failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ /* Get the Builtin Domain SID */
+ Status = GetBuiltinDomainSid(&EnumContext->BuiltinDomainSid);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("GetBuiltinDomainSid failed (Status %08lx)\n", Status);
ApiStatus = NetpNtStatusToApiStatus(Status);
goto done;
}
- Status = OpenBuiltinDomain(EnumContext->ServerHandle,
- DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP,
- &EnumContext->BuiltinDomainHandle);
+ DesiredAccess = DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP;
+ if ((level == 1) || (level == 2) || (level == 3) || (level == 4) || (level == 11))
+ DesiredAccess |= DOMAIN_GET_ALIAS_MEMBERSHIP;
+
+ /* Open the Builtin Domain */
+ Status = SamOpenDomain(EnumContext->ServerHandle,
+ DesiredAccess,
+ EnumContext->BuiltinDomainSid,
+ &EnumContext->BuiltinDomainHandle);
if (!NT_SUCCESS(Status))
{
- ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status);
+ ERR("SamOpenDomain failed (Status %08lx)\n", Status);
ApiStatus = NetpNtStatusToApiStatus(Status);
goto done;
}
if (EnumContext->Index >= EnumContext->Count)
{
-// if (EnumContext->BuiltinDone == TRUE)
+// if (EnumContext->BuiltinDone != FALSE)
// {
// ApiStatus = NERR_Success;
// goto done;
TRACE("RID: %lu\n", CurrentUser->RelativeId);
+ DesiredAccess = READ_CONTROL | USER_READ_GENERAL | USER_READ_PREFERENCES | USER_READ_LOGON | USER_READ_ACCOUNT;
+ if ((level == 1) || (level == 2) || (level == 3) || (level == 4) || (level == 11))
+ DesiredAccess |= USER_LIST_GROUPS;
+
Status = SamOpenUser(EnumContext->AccountDomainHandle, //BuiltinDomainHandle,
- READ_CONTROL | USER_READ_GENERAL | USER_READ_PREFERENCES | USER_READ_LOGON | USER_READ_ACCOUNT,
+ DesiredAccess,
CurrentUser->RelativeId,
&UserHandle);
if (!NT_SUCCESS(Status))
goto done;
}
- ApiStatus = BuildUserInfoBuffer(UserHandle,
- level,
+ ApiStatus = BuildUserInfoBuffer(EnumContext->BuiltinDomainHandle,
+ UserHandle,
+ EnumContext->AccountDomainSid,
CurrentUser->RelativeId,
+ level,
&Buffer);
if (ApiStatus != NERR_Success)
{
// }
done:
- if (ApiStatus == NERR_Success && EnumContext->Index < EnumContext->Count)
+ if (ApiStatus == NERR_Success && EnumContext != NULL && EnumContext->Index < EnumContext->Count)
ApiStatus = ERROR_MORE_DATA;
if (EnumContext != NULL)
if (EnumContext->AccountDomainHandle != NULL)
SamCloseHandle(EnumContext->AccountDomainHandle);
+ if (EnumContext->BuiltinDomainSid != NULL)
+ RtlFreeHeap(RtlGetProcessHeap(), 0, EnumContext->BuiltinDomainSid);
+
+ if (EnumContext->AccountDomainSid != NULL)
+ RtlFreeHeap(RtlGetProcessHeap(), 0, EnumContext->AccountDomainSid);
+
if (EnumContext->ServerHandle != NULL)
SamCloseHandle(EnumContext->ServerHandle);
SamFreeMemory(EnumContext->Buffer);
}
- NetApiBufferFree(EnumContext);
+ FreeEnumContext(EnumContext);
EnumContext = NULL;
}
}
SamCloseHandle(UserHandle);
if (resume_handle != NULL)
- *resume_handle = (DWORD_PTR)EnumContext;
+ *resume_handle = EnumContext ? EnumContext->EnumHandle : 0;
*bufptr = (LPBYTE)Buffer;
UNICODE_STRING UserName;
SAM_HANDLE ServerHandle = NULL;
SAM_HANDLE AccountDomainHandle = NULL;
+ SAM_HANDLE BuiltinDomainHandle = NULL;
SAM_HANDLE UserHandle = NULL;
PULONG RelativeIds = NULL;
PSID_NAME_USE Use = NULL;
LPVOID Buffer = NULL;
+ PSID AccountDomainSid = NULL;
+ PSID BuiltinDomainSid = NULL;
+ ACCESS_MASK DesiredAccess;
NET_API_STATUS ApiStatus = NERR_Success;
NTSTATUS Status = STATUS_SUCCESS;
goto done;
}
+ /* Get the Builtin Domain SID */
+ Status = GetBuiltinDomainSid(&BuiltinDomainSid);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("GetBuiltinDomainSid failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ DesiredAccess = DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP;
+ if ((level == 1) || (level == 2) || (level == 3) || (level == 4) || (level == 11))
+ DesiredAccess |= DOMAIN_GET_ALIAS_MEMBERSHIP;
+
+ /* Open the Builtin Domain */
+ Status = SamOpenDomain(ServerHandle,
+ DesiredAccess,
+ BuiltinDomainSid,
+ &BuiltinDomainHandle);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamOpenDomain failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ /* Get the Account Domain SID */
+ Status = GetAccountDomainSid((servername != NULL) ? &ServerName : NULL,
+ &AccountDomainSid);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("GetAccountDomainSid failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
/* Open the Account Domain */
- Status = OpenAccountDomain(ServerHandle,
- (servername != NULL) ? &ServerName : NULL,
- DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP,
- &AccountDomainHandle);
+ Status = SamOpenDomain(ServerHandle,
+ DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP,
+ AccountDomainSid,
+ &AccountDomainHandle);
if (!NT_SUCCESS(Status))
{
ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
TRACE("RID: %lu\n", RelativeIds[0]);
+ DesiredAccess = READ_CONTROL | USER_READ_GENERAL | USER_READ_PREFERENCES | USER_READ_LOGON | USER_READ_ACCOUNT;
+ if ((level == 1) || (level == 2) || (level == 3) || (level == 4) || (level == 11))
+ DesiredAccess |= USER_LIST_GROUPS;
+
/* Open the user object */
Status = SamOpenUser(AccountDomainHandle,
- READ_CONTROL | USER_READ_GENERAL | USER_READ_PREFERENCES | USER_READ_LOGON | USER_READ_ACCOUNT,
+ DesiredAccess,
RelativeIds[0],
&UserHandle);
if (!NT_SUCCESS(Status))
goto done;
}
- ApiStatus = BuildUserInfoBuffer(UserHandle,
- level,
+ ApiStatus = BuildUserInfoBuffer(BuiltinDomainHandle,
+ UserHandle,
+ AccountDomainSid,
RelativeIds[0],
+ level,
&Buffer);
if (ApiStatus != NERR_Success)
{
if (AccountDomainHandle != NULL)
SamCloseHandle(AccountDomainHandle);
+ if (AccountDomainSid != NULL)
+ RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid);
+
+ if (BuiltinDomainHandle != NULL)
+ SamCloseHandle(BuiltinDomainHandle);
+
+ if (BuiltinDomainSid != NULL)
+ RtlFreeHeap(RtlGetProcessHeap(), 0, BuiltinDomainSid);
+
if (ServerHandle != NULL)
SamCloseHandle(ServerHandle);
umi0 = (PUSER_MODALS_INFO_0)*bufptr;
umi0->usrmod0_min_passwd_len = PasswordInfo->MinPasswordLength;
- umi0->usrmod0_max_passwd_age = (ULONG)(PasswordInfo->MaxPasswordAge.QuadPart / 10000000);
+ umi0->usrmod0_max_passwd_age = (ULONG)(-PasswordInfo->MaxPasswordAge.QuadPart / 10000000);
umi0->usrmod0_min_passwd_age =
DeltaTimeToSeconds(PasswordInfo->MinPasswordAge);
umi0->usrmod0_force_logoff =
switch (ServerRoleInfo->DomainServerRole)
{
-
- umi1->usrmod1_role = UAS_ROLE_STANDALONE;
- umi1->usrmod1_role = UAS_ROLE_MEMBER;
-
case DomainServerRolePrimary:
umi1->usrmod1_role = UAS_ROLE_PRIMARY;
break;
case 1014:
case 1017:
case 1018:
-// case 1020:
+ case 1020:
case 1024:
case 1025:
case 1051:
/* Set user information */
ApiStatus = SetUserInfo(UserHandle,
buf,
- level);
+ level,
+ parm_err);
if (ApiStatus != NERR_Success)
{
ERR("SetUserInfo failed (Status %lu)\n", ApiStatus);