572 lines
18 KiB
C
572 lines
18 KiB
C
/*++
|
||
|
||
Copyright (c) 1991 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
temp.c
|
||
|
||
Abstract:
|
||
|
||
This file contains temporary SAM rpc wrapper routines.
|
||
|
||
Author:
|
||
|
||
Jim Kelly (JimK) 14-Feb-1992
|
||
|
||
Environment:
|
||
|
||
User Mode - Win32
|
||
|
||
Revision History:
|
||
|
||
|
||
--*/
|
||
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
// //
|
||
// Includes //
|
||
// //
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
|
||
#include "samclip.h"
|
||
|
||
|
||
typedef struct _SAMP_TEMP_USER_STRINGS {
|
||
ULONG Rid;
|
||
WCHAR LogonName[14];
|
||
WCHAR FullName[24];
|
||
WCHAR AdminComment[24];
|
||
} SAMP_TEMP_USER_STRINGS, *PSAMP_TEMP_USER_STRINGS;
|
||
|
||
|
||
#define SAMP_TEMP_USER_COUNT (40)
|
||
#define SAMP_TEMP_USER1 (25)
|
||
#define SAMP_TEMP_USER2 (15)
|
||
|
||
|
||
typedef struct _SAMP_TEMP_MACHINE_STRINGS {
|
||
ULONG Rid;
|
||
WCHAR Machine[14];
|
||
WCHAR Comment[24];
|
||
} SAMP_TEMP_MACHINE_STRINGS, *PSAMP_TEMP_MACHINE_STRINGS;
|
||
|
||
|
||
#define SAMP_TEMP_MACHINE_COUNT (40)
|
||
#define SAMP_TEMP_MACHINE1 (16)
|
||
#define SAMP_TEMP_MACHINE2 (24)
|
||
|
||
|
||
SAMP_TEMP_USER_STRINGS DummyUsers[SAMP_TEMP_USER_COUNT] = {
|
||
|
||
{1031, L"Abba" , L"Abb Abb" , L"Admin Comment Field"},
|
||
{1021, L"Acea" , L"Ace Abb" , L"Value Admin Comment"},
|
||
{1526, L"beverlyE" , L"Beverly Eng" , L"Field Value Admin"},
|
||
{1743, L"BorisB" , L"Boris Borsch" , L"Comment Field Value"},
|
||
{1734, L"BruceK" , L"Bruce Kane" , L"Comment Field Value"},
|
||
{1289, L"BullS" , L"Bull Shiite" , L"Comment Field Value"},
|
||
{1830, L"CallieW" , L"Callie Wilson" , L"Comment Field Value"},
|
||
{1628, L"CarrieT" , L"Carrie Tibbits" , L"Comment Field Value"},
|
||
{1943, L"ChrisR" , L"Christopher Robin" , L"40 acre woods"},
|
||
{1538, L"CorneliaG" , L"Cornelia Gutierrez" , L"Comment Field Value"},
|
||
{1563, L"CoryA" , L"Cory Ander" , L"Comment Field Value"},
|
||
{1758, L"DanielJ" , L"Daniel John" , L"Comment Field Value"},
|
||
{1249, L"Dory" , L"Dory" , L"Comment Field Value"},
|
||
{1957, L"EltonJ" , L"Elton John" , L"Comment Field Value"},
|
||
{1555, L"HarrisonF" , L"Harrison Ford" , L"Comment Field Value"},
|
||
{1795, L"HarryB" , L"Harry Belafonte" , L"Comment Field Value"},
|
||
{1458, L"IngridB" , L"Ingrid Bergman" , L"Comment Field Value"},
|
||
{1672, L"Ingris" , L"Ingris" , L"Comment Field Value"},
|
||
{1571, L"JenniferB" , L"Jennifer Black" , L"Comment Field Value"},
|
||
{1986, L"JoyceG" , L"Joyce Gerace" , L"Comment Field Value"},
|
||
{1267, L"KristinM" , L"Kristin McKay" , L"Comment Field Value"},
|
||
{1321, L"LeahD" , L"Leah Dootson" , L"The Lovely Miss D"},
|
||
{2021, L"LisaP" , L"Lisa Perazzoli" , L"Wild On Skis"},
|
||
{1212, L"MeganB" , L"Megan Bombeck" , L"M1"},
|
||
{2758, L"MelisaB" , L"Melisa Bombeck" , L"M3"},
|
||
{2789, L"MichaelB" , L"Michael Bombeck" , L"M2"},
|
||
{2682, L"PanelopiP" , L"Panelopi Pitstop" , L"Comment Field Value"},
|
||
{2438, L"Prudence" , L"Prudence Peackock" , L"Comment Field Value"},
|
||
{2648, L"QwertyU" , L"Qwerty Uiop" , L"Comment Field Value"},
|
||
{2681, L"ReaddyE" , L"Readdy Eddy" , L""},
|
||
{2456, L"SovietA" , L"Soviet Union - NOT" , L"Soviet Union Aint"},
|
||
{1753, L"TAAAA" , L"TTT AAAA" , L"Comment Field Value"},
|
||
{1357, L"TBBB" , L"Ingris" , L"Comment Field Value"},
|
||
{1951, L"TCCCCC" , L"Jennifer Black" , L"Comment Field Value"},
|
||
{1159, L"TCAAAAAA" , L"Joyce Gerace" , L"Comment Field Value"},
|
||
{1654, L"Ulga" , L"Ulga Bulga" , L"Comment Field Value"},
|
||
{1456, L"UnixY" , L"Unix Yuck" , L"Unix - why ask why?"},
|
||
{1852, L"Vera" , L"Vera Pensicola" , L""},
|
||
{1258, L"WinP" , L"Winnie The Pooh" , L"Comment Field Value"},
|
||
{2821, L"Zoro" , L"Zoro" , L"The sign of the Z"}
|
||
};
|
||
|
||
|
||
|
||
|
||
|
||
SAMP_TEMP_MACHINE_STRINGS DummyMachines[SAMP_TEMP_MACHINE_COUNT] = {
|
||
|
||
{1031, L"WKS$abba" , L"Admin Comment Field"},
|
||
{1021, L"WKS$Acea" , L"Value Admin Comment"},
|
||
{1526, L"WKS$beverlyE" , L"Field Value Admin"},
|
||
{1743, L"WKS$BorisB" , L"Comment Field Value"},
|
||
{1734, L"WKS$BruceK" , L"Comment Field Value"},
|
||
{1289, L"WKS$BullS" , L"Comment Field Value"},
|
||
{1830, L"WKS$CallieW" , L"Comment Field Value"},
|
||
{1628, L"WKS$CarrieT" , L"Comment Field Value"},
|
||
{1943, L"WKS$ChrisR" , L"40 acre woods Server"},
|
||
{1538, L"WKS$CorneliaG" , L"Comment Field Value"},
|
||
{1563, L"WKS$CoryA" , L"Comment Field Value"},
|
||
{1758, L"WKS$DanielJ" , L"Comment Field Value"},
|
||
{1249, L"WKS$Dory" , L"Comment Field Value"},
|
||
{1957, L"WKS$EltonJ" , L"Comment Field Value"},
|
||
{1555, L"WKS$HarrisonF" , L"Comment Field Value"},
|
||
{1795, L"WKS$HarryB" , L"Comment Field Value"},
|
||
{1458, L"WKS$IngridB" , L"Comment Field Value"},
|
||
{1672, L"WKS$Ingris" , L"Comment Field Value"},
|
||
{1571, L"WKS$JenniferB" , L"Comment Field Value"},
|
||
{1986, L"WKS$JoyceG" , L"Comment Field Value"},
|
||
{1267, L"WKS$KristinM" , L"Comment Field Value"},
|
||
{1321, L"WKS$LeahD" , L"The Lovely Miss D's"},
|
||
{2021, L"WKS$LisaP" , L"Wild On Skis Server"},
|
||
{1212, L"WKS$MeganB" , L"M1 Machine"},
|
||
{2758, L"WKS$MelisaB" , L"M3 Machine"},
|
||
{2789, L"WKS$MichaelB" , L"M2 Machine"},
|
||
{2682, L"WKS$PanelopiP" , L"Comment Field Value"},
|
||
{2438, L"WKS$Prudence" , L"Comment Field Value"},
|
||
{2648, L"WKS$QwertyU" , L"Comment Field Value"},
|
||
{2681, L"WKS$ReaddyE" , L"Ready Eddy Computer"},
|
||
{2456, L"WKS$SovietA" , L"Soviet Union Aint"},
|
||
{1753, L"WKS$TAAAA" , L"Comment Field Value"},
|
||
{1357, L"WKS$TBBB" , L"Comment Field Value"},
|
||
{1951, L"WKS$TCCCCC" , L"Comment Field Value"},
|
||
{1159, L"WKS$TCAAAAAA" , L"Comment Field Value"},
|
||
{1654, L"WKS$Ulga" , L"Comment Field Value"},
|
||
{1456, L"WKS$UnixY" , L"Unix - why ask why?"},
|
||
{1852, L"WKS$Vera" , L"Vera tissue"},
|
||
{1258, L"WKS$WinP" , L"Comment Field Value"},
|
||
{2821, L"WKS$Zoro" , L"The sign of the Z"}
|
||
};
|
||
|
||
|
||
|
||
|
||
VOID
|
||
SampBuildDummyAccounts(
|
||
IN DOMAIN_DISPLAY_INFORMATION DisplayInformation,
|
||
IN ULONG Index,
|
||
OUT PULONG TotalAvailable,
|
||
OUT PULONG TotalReturned,
|
||
OUT PULONG ReturnedEntryCount,
|
||
OUT PVOID *SortedBuffer
|
||
);
|
||
|
||
|
||
|
||
VOID
|
||
SampBuildDummyAccounts(
|
||
IN DOMAIN_DISPLAY_INFORMATION DisplayInformation,
|
||
IN ULONG Index,
|
||
OUT PULONG TotalAvailable,
|
||
OUT PULONG TotalReturned,
|
||
OUT PULONG ReturnedEntryCount,
|
||
OUT PVOID *SortedBuffer
|
||
)
|
||
|
||
{
|
||
ULONG AccountCount, Account1, Account2;
|
||
ULONG i, j, BeginIndex, EndIndex;
|
||
ULONG ReturnStructSize, ArrayLength, StringLengths;
|
||
PCHAR NextByte;
|
||
UNICODE_STRING Us;
|
||
|
||
|
||
|
||
ASSERT (SAMP_TEMP_USER1 != 0);
|
||
ASSERT (SAMP_TEMP_USER2 != 0);
|
||
ASSERT (SAMP_TEMP_MACHINE1 != 0);
|
||
ASSERT (SAMP_TEMP_MACHINE2 != 0);
|
||
|
||
if (DisplayInformation == DomainDisplayUser) {
|
||
|
||
ReturnStructSize = sizeof(DOMAIN_DISPLAY_USER);
|
||
Account1 = SAMP_TEMP_USER1;
|
||
Account2 = SAMP_TEMP_USER2;
|
||
AccountCount = SAMP_TEMP_USER_COUNT;
|
||
|
||
} else {
|
||
|
||
ReturnStructSize = sizeof(DOMAIN_DISPLAY_MACHINE);
|
||
Account1 = SAMP_TEMP_MACHINE1;
|
||
Account2 = SAMP_TEMP_MACHINE2;
|
||
AccountCount = SAMP_TEMP_MACHINE_COUNT;
|
||
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// Build up a number of dummy accounts in a single buffer.
|
||
//
|
||
|
||
|
||
if (Index < Account1) {
|
||
|
||
//
|
||
// Give the first group of accounts
|
||
//
|
||
|
||
ArrayLength = ReturnStructSize * Account1;
|
||
BeginIndex = 0;
|
||
EndIndex = Account1;
|
||
|
||
|
||
} else {
|
||
|
||
//
|
||
// Give the second group of accounts
|
||
//
|
||
|
||
ArrayLength = ReturnStructSize * Account2;
|
||
BeginIndex = Account1;
|
||
EndIndex = AccountCount;
|
||
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// Figure out how large a buffer is needed.
|
||
//
|
||
|
||
StringLengths = 0;
|
||
for (i=BeginIndex; i<EndIndex; i++) {
|
||
|
||
if (DisplayInformation == DomainDisplayUser) {
|
||
|
||
RtlInitUnicodeString( &Us, DummyUsers[i].LogonName);
|
||
StringLengths += Us.Length;
|
||
RtlInitUnicodeString( &Us, DummyUsers[i].FullName);
|
||
StringLengths += Us.Length;
|
||
RtlInitUnicodeString( &Us, DummyUsers[i].AdminComment);
|
||
StringLengths += Us.Length;
|
||
|
||
} else {
|
||
|
||
RtlInitUnicodeString( &Us, DummyMachines[i].Machine);
|
||
StringLengths += Us.Length;
|
||
RtlInitUnicodeString( &Us, DummyMachines[i].Comment);
|
||
StringLengths += Us.Length;
|
||
|
||
}
|
||
|
||
}
|
||
(*SortedBuffer) = MIDL_user_allocate( ArrayLength + StringLengths );
|
||
ASSERT(SortedBuffer != NULL);
|
||
|
||
|
||
//
|
||
// First free byte in the return buffer
|
||
//
|
||
|
||
NextByte = (PCHAR)((ULONG)(*SortedBuffer) + (ULONG)ArrayLength);
|
||
|
||
|
||
//
|
||
// Now copy the structures
|
||
|
||
if (DisplayInformation == DomainDisplayUser) {
|
||
|
||
PDOMAIN_DISPLAY_USER r;
|
||
r = (PDOMAIN_DISPLAY_USER)(*SortedBuffer);
|
||
|
||
j=0;
|
||
for (i=BeginIndex; i<EndIndex; i++) {
|
||
|
||
r[j].AccountControl = USER_NORMAL_ACCOUNT;
|
||
r[j].Index = i;
|
||
r[j].Rid = DummyUsers[i].Rid;
|
||
|
||
|
||
//
|
||
// copy the logon name
|
||
//
|
||
|
||
RtlInitUnicodeString( &Us, DummyUsers[i].LogonName);
|
||
r[j].LogonName.MaximumLength = Us.Length;
|
||
r[j].LogonName.Length = Us.Length;
|
||
r[j].LogonName.Buffer = (PWSTR)NextByte;
|
||
RtlMoveMemory(NextByte, Us.Buffer, r[j].LogonName.Length);
|
||
NextByte += r[j].LogonName.Length;
|
||
|
||
//
|
||
// copy the full name
|
||
//
|
||
|
||
RtlInitUnicodeString( &Us, DummyUsers[i].FullName);
|
||
r[j].FullName.MaximumLength = Us.Length;
|
||
r[j].FullName.Length = Us.Length;
|
||
r[j].FullName.Buffer = (PWSTR)NextByte;
|
||
RtlMoveMemory(NextByte, Us.Buffer, r[j].FullName.Length);
|
||
NextByte += r[j].FullName.Length;
|
||
|
||
//
|
||
// copy the admin comment
|
||
//
|
||
|
||
RtlInitUnicodeString( &Us, DummyUsers[i].AdminComment);
|
||
r[j].AdminComment.MaximumLength = Us.Length;
|
||
r[j].AdminComment.Length = Us.Length;
|
||
r[j].AdminComment.Buffer = (PWSTR)NextByte;
|
||
RtlMoveMemory(NextByte, Us.Buffer, r[j].AdminComment.Length);
|
||
NextByte += r[j].AdminComment.Length;
|
||
|
||
j++;
|
||
|
||
}
|
||
|
||
} else {
|
||
|
||
PDOMAIN_DISPLAY_MACHINE r;
|
||
r = (PDOMAIN_DISPLAY_MACHINE)(*SortedBuffer);
|
||
|
||
j=0;
|
||
for (i=BeginIndex; i<EndIndex; i++) {
|
||
|
||
|
||
r[j].AccountControl = USER_WORKSTATION_TRUST_ACCOUNT;
|
||
r[j].Index = i;
|
||
r[j].Rid = DummyMachines[i].Rid;
|
||
|
||
|
||
//
|
||
// copy the logon name
|
||
//
|
||
|
||
RtlInitUnicodeString( &Us, DummyMachines[i].Machine);
|
||
r[j].Machine.MaximumLength = Us.Length;
|
||
r[j].Machine.Length = Us.Length;
|
||
r[j].Machine.Buffer = (PWSTR)NextByte;
|
||
RtlMoveMemory(NextByte, Us.Buffer, r[j].Machine.Length);
|
||
NextByte += r[j].Machine.Length;
|
||
|
||
|
||
//
|
||
// copy the admin comment
|
||
//
|
||
|
||
RtlInitUnicodeString( &Us, DummyMachines[i].Comment);
|
||
r[j].Comment.MaximumLength = Us.Length;
|
||
r[j].Comment.Length = Us.Length;
|
||
r[j].Comment.Buffer = (PWSTR)NextByte;
|
||
RtlMoveMemory(NextByte, Us.Buffer, r[j].Comment.Length);
|
||
NextByte += r[j].Comment.Length;
|
||
|
||
j++;
|
||
|
||
}
|
||
|
||
|
||
}
|
||
|
||
(*TotalAvailable) = 6*1024; // A lie, but just a little lie.
|
||
(*TotalReturned) = ArrayLength + StringLengths;
|
||
(*ReturnedEntryCount) = EndIndex - BeginIndex;
|
||
|
||
|
||
return;
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
NTSTATUS
|
||
SamQueryDisplayInformation (
|
||
IN SAM_HANDLE DomainHandle,
|
||
IN DOMAIN_DISPLAY_INFORMATION DisplayInformation,
|
||
IN ULONG Index,
|
||
IN ULONG PreferredMaximumLength,
|
||
OUT PULONG TotalAvailable,
|
||
OUT PULONG TotalReturned,
|
||
OUT PULONG ReturnedEntryCount,
|
||
OUT PVOID *SortedBuffer
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine provides fast return of information commonly
|
||
needed to be displayed in user interfaces.
|
||
|
||
NT User Interface has a requirement for quick enumeration of SAM
|
||
accounts for display in list boxes. (Replication has similar but
|
||
broader requirements.)
|
||
|
||
The netui listboxes all contain similar information. That is:
|
||
|
||
o AccountControl, the bits that identify the account type,
|
||
eg, HOME, REMOTE, SERVER, WORKSTATION, etc.
|
||
|
||
o Logon name (machine name for computers)
|
||
|
||
o Full name (not used for computers)
|
||
|
||
o Comment (admin comment for users)
|
||
|
||
SAM maintains this data locally in two sorted indexed cached
|
||
lists identified by infolevels.
|
||
|
||
o DomainDisplayUser: HOME and REMOTE user accounts only
|
||
|
||
o DomainDisplayMachine: SERVER and WORKSTATION accounts only
|
||
|
||
Note that trust accounts, groups, and aliases are not in either of
|
||
these lists.
|
||
|
||
Parameters:
|
||
|
||
DomainHandle - A handle to an open domain for DOMAIN_LIST_ACCOUNTS.
|
||
|
||
DisplayInformation - Indicates which information is to be enumerated.
|
||
|
||
Index - The index of the first entry to be retrieved.
|
||
|
||
PreferedMaximumLength - A recommended upper limit to the number of
|
||
bytes to be returned. The returned information is allocated by
|
||
this routine.
|
||
|
||
TotalAvailable - Total number of bytes availabe in the specified info
|
||
class.
|
||
|
||
TotalReturned - Number of bytes actually returned for this call. Zero
|
||
indicates there are no entries with an index as large as that
|
||
specified.
|
||
|
||
ReturnedEntryCount - Number of entries returned by this call. Zero
|
||
indicates there are no entries with an index as large as that
|
||
specified.
|
||
|
||
|
||
SortedBuffer - Receives a pointer to a buffer containing a sorted
|
||
list of the requested information. This buffer is allocated
|
||
by this routine and contains the following structure:
|
||
|
||
|
||
DomainDisplayMachine --> An array of ReturnedEntryCount elements
|
||
of type DOMAIN_DISPLAY_USER. This is
|
||
followed by the bodies of the various
|
||
strings pointed to from within the
|
||
DOMAIN_DISPLAY_USER structures.
|
||
|
||
DomainDisplayMachine --> An array of ReturnedEntryCount elements
|
||
of type DOMAIN_DISPLAY_MACHINE. This is
|
||
followed by the bodies of the various
|
||
strings pointed to from within the
|
||
DOMAIN_DISPLAY_MACHINE structures.
|
||
|
||
Return Values:
|
||
|
||
STATUS_SUCCESS - normal, successful completion.
|
||
|
||
STATUS_ACCESS_DENIED - The specified handle was not opened for
|
||
the necessary access.
|
||
|
||
STATUS_INVALID_HANDLE - The specified handle is not that of an
|
||
opened Domain object.
|
||
|
||
STATUS_INVALID_INFO_CLASS - The requested class of information
|
||
is not legitimate for this service.
|
||
|
||
|
||
|
||
|
||
|
||
--*/
|
||
{
|
||
|
||
|
||
|
||
// if ((DisplayInformation != DomainDisplayUser) &&
|
||
// (DisplayInformation != DomainDisplayMachine) ) {
|
||
// return( STATUS_INVALID_INFO_CLASS );
|
||
//
|
||
// }
|
||
|
||
|
||
|
||
SampBuildDummyAccounts( DisplayInformation,
|
||
Index,
|
||
TotalAvailable,
|
||
TotalReturned,
|
||
ReturnedEntryCount,
|
||
SortedBuffer);
|
||
|
||
return(STATUS_SUCCESS);
|
||
|
||
DBG_UNREFERENCED_PARAMETER(DomainHandle);
|
||
DBG_UNREFERENCED_PARAMETER(PreferredMaximumLength);
|
||
|
||
}
|
||
|
||
|
||
NTSTATUS
|
||
SamGetDisplayEnumerationIndex (
|
||
IN SAM_HANDLE DomainHandle,
|
||
IN DOMAIN_DISPLAY_INFORMATION DisplayInformation,
|
||
IN PUNICODE_STRING Prefix,
|
||
OUT PULONG Index
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine returns the index of the entry which alphabetically
|
||
immediatly preceeds a specified prefix. If no such entry exists,
|
||
then zero is returned as the index.
|
||
|
||
Parameters:
|
||
|
||
DomainHandle - A handle to an open domain for DOMAIN_LIST_ACCOUNTS.
|
||
|
||
DisplayInformation - Indicates which sorted information class is
|
||
to be searched.
|
||
|
||
Prefix - The prefix to compare.
|
||
|
||
Index - Receives the index of the entry of the information class
|
||
with a LogonName (or MachineName) which immediatly preceeds the
|
||
provided prefix string. If there are no elements which preceed
|
||
the prefix, then zero is returned.
|
||
|
||
|
||
Return Values:
|
||
|
||
STATUS_SUCCESS - normal, successful completion.
|
||
|
||
STATUS_ACCESS_DENIED - The specified handle was not opened for
|
||
the necessary access.
|
||
|
||
STATUS_INVALID_HANDLE - The specified handle is not that of an
|
||
opened Domain object.
|
||
|
||
|
||
--*/
|
||
{
|
||
|
||
(*Index) = 0;
|
||
|
||
return(STATUS_SUCCESS);
|
||
|
||
|
||
DBG_UNREFERENCED_PARAMETER(DomainHandle);
|
||
DBG_UNREFERENCED_PARAMETER(DisplayInformation);
|
||
DBG_UNREFERENCED_PARAMETER(Prefix);
|
||
|
||
}
|
||
|
||
|