Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

595 lines
17 KiB

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2001, Microsoft Corporation All rights reserved.
//
// Module Name:
//
// users.c
//
// Abstract:
//
// This file contains dialog to show the users dialog of the
// euroconv.exe utility.
//
// Revision History:
//
// 2001-07-30 lguindon Created.
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Includes Files.
//
///////////////////////////////////////////////////////////////////////////////
#include "euroconv.h"
#include "users.h"
#include "util.h"
///////////////////////////////////////////////////////////////////////////////
//
// Globals.
//
///////////////////////////////////////////////////////////////////////////////
CHAR gszProfileNT[] = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList";
CHAR gszProfileVal[] = "ProfileImagePath";
///////////////////////////////////////////////////////////////////////////////
//
// UsersDialogProc
//
// Message handler function for the Users dialog.
//
///////////////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK UsersDialogProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HANDLE hFile;
DWORD dwFileSize;
DWORD dwActual;
LPVOID pFileBuffer;
CHAR szEulaPath[MAX_PATH];
switch ( uMsg )
{
case WM_INITDIALOG:
{
HWND hwndInc = GetDlgItem(hWndDlg, IDC_INCLUDED);
HWND hwndExc = GetDlgItem(hWndDlg, IDC_EXCLUDED);
RECT Rect;
LV_COLUMN Column;
//
// Create a column for the Inclusion list view.
//
GetClientRect(hwndInc, &Rect);
Column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
Column.fmt = LVCFMT_LEFT;
Column.cx = Rect.right - GetSystemMetrics(SM_CYHSCROLL);
Column.pszText = NULL;
Column.cchTextMax = 0;
Column.iSubItem = 0;
ListView_InsertColumn(hwndInc, 0, &Column);
//
// Create a column for the Exclusion list view.
//
GetClientRect(hwndExc, &Rect);
Column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
Column.fmt = LVCFMT_LEFT;
Column.cx = Rect.right - GetSystemMetrics(SM_CYHSCROLL);
Column.pszText = NULL;
Column.cchTextMax = 0;
Column.iSubItem = 0;
ListView_InsertColumn(hwndExc, 0, &Column);
//
// Fill out both list
//
ListUsersInfo(hWndDlg);
return 0;
}
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDOK:
{
EndDialog(hWndDlg, ERROR_SUCCESS);
return (1);
}
case IDCANCEL:
{
EndDialog(hWndDlg, ERROR_SUCCESS);
return (1);
}
}
break;
}
case WM_CLOSE:
{
EndDialog(hWndDlg, ERROR_SUCCESS);
return (1);
}
}
return 0;
}
///////////////////////////////////////////////////////////////////////////////
//
// UsersDialog
//
// Display the Users dialog.
//
///////////////////////////////////////////////////////////////////////////////
BOOL UsersDialog(HWND hDlg)
{
INT_PTR Status;
Status = DialogBox( NULL,
MAKEINTRESOURCE(IDD_USERS),
hDlg,
UsersDialogProc);
return (Status == ERROR_SUCCESS);
}
///////////////////////////////////////////////////////////////////////////////
//
// ListUsersInfo
//
// List users and locale information in the appropriate List Box.
//
///////////////////////////////////////////////////////////////////////////////
void ListUsersInfo(HWND hDlg)
{
HWND hwndInc = GetDlgItem(hDlg, IDC_INCLUDED);
HWND hwndExc = GetDlgItem(hDlg, IDC_EXCLUDED);
//
// List users based on registry entries.
//
ListUsersInfoFromRegistry(hDlg);
//
// List users using a method valid only for Windows NT based on
// user profiles.
//
if (!IsWindows9x())
{
ListUsersInfoFromFile(hDlg);
}
//
// Verify if the inclusion is empty.
//
if(!ListView_GetItemCount(hwndInc))
{
//
// Add the empty item ot the list.
//
AddToList(hwndInc, NULL, (LCID)0);
}
//
// Verify if the exclusion is empty.
//
if(!ListView_GetItemCount(hwndExc))
{
//
// Add the empty item ot the list.
//
AddToList(hwndExc, NULL, (LCID)0);
}
}
///////////////////////////////////////////////////////////////////////////////
//
// ListUsersInfoFromFile
//
// List users and locale information in the appropriate List Box.
//
///////////////////////////////////////////////////////////////////////////////
void ListUsersInfoFromFile(HWND hDlg)
{
LCID locale;
PEURO_EXCEPTION pInfo;
HWND hwndInc = GetDlgItem(hDlg, IDC_INCLUDED);
HWND hwndExc = GetDlgItem(hDlg, IDC_EXCLUDED);
//
// Proceed with all users if requested.
//
if (gbAll)
{
CHAR docFolder[MAX_PATH] = {0};
CHAR userFileData[MAX_PATH] = {0};
CHAR searchPattern[MAX_PATH] = {0};
WIN32_FIND_DATA fileData;
HANDLE hList;
//
// Get Documents and Settings folder
//
if (!GetDocumentAndSettingsFolder(docFolder))
{
return;
}
//
// Append a wildcard after the directory path to find
// out all files/folders under it.
//
//strcpy(searchPattern, docFolder);
//strcat(searchPattern, "\\*.*");
StringCbCopy(searchPattern, MAX_PATH, docFolder);
StringCbCatA(searchPattern, MAX_PATH, "\\*.*");
//
// List all files/folder under the profile directory
//
hList = FindFirstFile(searchPattern, &fileData);
if (hList == INVALID_HANDLE_VALUE)
{
return;
}
//
// Search through the Documents and settings folder for users.
//
do
{
//
// Check if it's a directory
//
if (fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
//
// Build a full path for the User data file.
//
//strcpy(userFileData, docFolder);
//strcat(userFileData, "\\");
//strcat(userFileData, fileData.cFileName);
//strcat(userFileData, "\\NTUSER.DAT");
StringCbCopy(userFileData, MAX_PATH, docFolder);
StringCbCatA(userFileData, MAX_PATH, "\\");
StringCbCatA(userFileData, MAX_PATH, fileData.cFileName);
StringCbCatA(userFileData, MAX_PATH, "\\NTUSER.DAT");
//
// Check if the file is associated to a valid user and
// get user locale from the user data file.
//
if (IsValidUserDataFile(userFileData) &&
(locale = GetLocaleFromFile(userFileData)))
{
//
// Search for an exception and to the proper list.
//
if ((pInfo = GetLocaleOverrideInfo(locale)) != NULL)
{
//
// Add item to the inclusion list
//
AddToList(hwndInc, CharUpper(fileData.cFileName), locale);
}
else
{
//
// Add item to the exclusion list
//
AddToList(hwndExc, CharUpper(fileData.cFileName), locale);
}
}
}
}
while(FindNextFile(hList, &fileData));
//
// Close handle.
//
FindClose(hList);
}
}
///////////////////////////////////////////////////////////////////////////////
//
// ListUsersInfo
//
// List users and locale information in the appropriate List Box.
//
///////////////////////////////////////////////////////////////////////////////
void ListUsersInfoFromRegistry(HWND hDlg)
{
LCID locale;
PEURO_EXCEPTION pInfo;
HWND hwndInc = GetDlgItem(hDlg, IDC_INCLUDED);
HWND hwndExc = GetDlgItem(hDlg, IDC_EXCLUDED);
CHAR strUser[REGSTR_MAX_VALUE_LENGTH] = {0};
DWORD dwUser = REGSTR_MAX_VALUE_LENGTH;
//
// Proceed with all users if requested.
//
if (gbAll)
{
DWORD dwKeyLength, dwKeyIndex = 0;
CHAR szKey[REGSTR_MAX_VALUE_LENGTH]; // this should be dynamic.
HKEY hKey;
DWORD lRet;
LPSTR endPtr;
//
// Go through all users for registry settings.
//
for (;;)
{
dwKeyLength = REGSTR_MAX_VALUE_LENGTH;
lRet = RegEnumKeyEx( HKEY_USERS,
dwKeyIndex,
szKey,
&dwKeyLength,
NULL,
NULL,
NULL,
NULL );
if (lRet == ERROR_NO_MORE_ITEMS)
{
lRet = ERROR_SUCCESS;
break;
}
else if (lRet == ERROR_SUCCESS)
{
//
// Open the registry
//
if (RegOpenKeyEx( HKEY_USERS,
szKey,
0,
KEY_READ,
&hKey) == ERROR_SUCCESS)
{
//
// Get user locale
//
if (locale = GetLocaleFromRegistry(hKey))
{
//
// Get user name.
//
if ((_stricmp(szKey, ".DEFAULT") == 0) ||
(_stricmp(szKey, "Default User") == 0))
{
//strcpy(strUser, "DEFAULT USER");
StringCbCopy(strUser, ARRAYSIZE(strUser), "DEFAULT USER");
}
else
{
GetUserNameFromRegistry(szKey, ARRAYSIZE(szKey), strUser, ARRAYSIZE(strUser));
}
//
// Search for an exception and to the proper list.
//
if ((pInfo = GetLocaleOverrideInfo(locale)) != NULL)
{
//
// Add item to the inclusion list
//
AddToList(hwndInc, strUser, locale);
}
else
{
//
// Add item to the inclusion list
//
AddToList(hwndExc, strUser, locale);
}
}
//
// Close handle
//
RegCloseKey(hKey);
}
}
else
{
break;
}
//
// Next keys
//
++dwKeyIndex;
}
}
else
{
//
// Get user locale.
//
locale = GetUserDefaultLCID();
//
// Get user name.
//
GetUserName(strUser, &dwUser);
//
// Search for an exception and to the proper list.
//
if ((pInfo = GetLocaleOverrideInfo(locale)) != NULL)
{
//
// Add item to the inclusion list
//
AddToList(hwndInc, strUser, locale);
}
else
{
//
// Add item to the exclusion list
//
AddToList(hwndExc, strUser, locale);
}
}
}
///////////////////////////////////////////////////////////////////////////////
//
// AddToList
//
// Generate an entry add to a specific list.
//
///////////////////////////////////////////////////////////////////////////////
void AddToList(HWND hDlg, LPSTR user, LCID locale)
{
LV_ITEM Item;
LVFINDINFO findInfo;
CHAR strItem[MAX_PATH];
CHAR strLocale[MAX_PATH] = {0};
//
// Get the locale name
//
GetLocaleInfo(locale, LOCALE_SLANGUAGE, strLocale, MAX_PATH);
//
// Create the string.
//
if (user)
{
//sprintf(strItem, "%s - %s", user, strLocale);
StringCchPrintf(strItem, MAX_PATH, "%s - %s", user, strLocale);
}
else
{
LoadString(ghInstance, IDS_EMPTY, strItem, MAX_PATH);
}
//
// Create a find structure.
//
findInfo.flags = LVFI_PARTIAL;
findInfo.psz = user;
findInfo.lParam = 0;
findInfo.vkDirection = 0;
//
// Before adding the string, checks if already there.
//
if (ListView_FindItem(hDlg, -1, &findInfo) < 0)
{
//
// Create the list item to be inserted.
//
Item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
Item.iItem = 0;
Item.iSubItem = 0;
Item.state = 0;
Item.stateMask = LVIS_STATEIMAGEMASK;
Item.pszText = strItem;
Item.cchTextMax = 0;
Item.iImage = 0;
Item.lParam = 0;
//
// Insert the item into the list view.
//
ListView_InsertItem(hDlg, &Item);
}
}
///////////////////////////////////////////////////////////////////////////////
//
// GetUserNameFromRegistry
//
// Get user name.
//
///////////////////////////////////////////////////////////////////////////////
void GetUserNameFromRegistry(LPSTR strKey, int cbKey, LPSTR name, int cbname)
{
CHAR strUserKey[REGSTR_MAX_VALUE_LENGTH];
CHAR strProfilePath[REGSTR_MAX_VALUE_LENGTH] = {0};
DWORD dwPath = REGSTR_MAX_VALUE_LENGTH;
LPSTR ptrName = NULL;
HKEY hKey;
//
// Process different on each platform.
//
if (IsWindows9x())
{
//
// Use the key name directly.
//
//strcpy(name, strKey);
StringCbCopy(name, cbKey, strKey);
//
// Uppercase
//
CharUpper(name);
return;
}
else
{
//
// Form the registry path.
//
//sprintf(strUserKey, "%s\\%s", gszProfileNT, strKey);
StringCchPrintf(strUserKey, ARRAYSIZE(strUserKey), "%s\\%s", gszProfileNT, strKey);
//
// Open the registry key previously formed.
//
if (RegOpenKeyEx( HKEY_LOCAL_MACHINE,
strUserKey,
0,
KEY_READ,
&hKey) == ERROR_SUCCESS)
{
//
// Query the value
//
if (RegQueryValueEx( hKey,
gszProfileVal,
NULL,
NULL,
strProfilePath,
&dwPath) == ERROR_SUCCESS)
{
if (ptrName = strrchr(strProfilePath, '\\'))
{
ptrName++;
}
}
}
//
// Return the name.
//
if (ptrName)
{
CharUpper(ptrName);
//strcpy(name, ptrName);
StringCbCopy(name, cbname, ptrName);
}
else
{
//strcpy(name, strKey);
StringCbCopy(name, cbname, strKey);
}
}
}