479 lines
8.6 KiB
C
479 lines
8.6 KiB
C
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
sharegen.c
|
|
|
|
Abstract:
|
|
|
|
Implements a stub tool that is designed to run with NT-side
|
|
upgrade code.
|
|
|
|
Author:
|
|
|
|
<full name> (<alias>) <date>
|
|
|
|
Revision History:
|
|
|
|
<alias> <date> <comments>
|
|
|
|
--*/
|
|
|
|
#include "pch.h"
|
|
|
|
|
|
#define W95_ACCESS_READ 0x1
|
|
#define W95_ACCESS_WRITE 0x2
|
|
#define W95_ACCESS_CREATE 0x4
|
|
#define W95_ACCESS_EXEC 0x8
|
|
#define W95_ACCESS_DELETE 0x10
|
|
#define W95_ACCESS_ATRIB 0x20
|
|
#define W95_ACCESS_PERM 0x40
|
|
#define W95_ACCESS_FINDFIRST 0x80
|
|
#define W95_ACCESS_FULL 0xff
|
|
#define W95_ACCESS_GROUP 0x8000
|
|
|
|
#define W95_GENERIC_READ (W95_ACCESS_READ|W95_ACCESS_EXEC|W95_ACCESS_FINDFIRST)
|
|
#define W95_GENERIC_WRITE (W95_ACCESS_FULL ^ W95_GENERIC_READ)
|
|
#define W95_GENERIC_FULL (W95_ACCESS_FULL)
|
|
#define W95_GENERIC_NONE 0
|
|
|
|
|
|
#define SHI50F_RDONLY 0x0001
|
|
#define SHI50F_FULL 0x0002
|
|
#define SHI50F_DEPENDSON (SHI50F_RDONLY|SHI50F_FULL)
|
|
#define SHI50F_ACCESSMASK (SHI50F_RDONLY|SHI50F_FULL)
|
|
|
|
|
|
BOOL
|
|
Init (
|
|
VOID
|
|
)
|
|
{
|
|
HINSTANCE hInstance;
|
|
DWORD dwReason;
|
|
PVOID lpReserved;
|
|
|
|
//
|
|
// Simulate DllMain
|
|
//
|
|
|
|
hInstance = GetModuleHandle (NULL);
|
|
dwReason = DLL_PROCESS_ATTACH;
|
|
lpReserved = NULL;
|
|
|
|
//
|
|
// Initialize DLL globals
|
|
//
|
|
|
|
if (!FirstInitRoutine (hInstance)) {
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Initialize all libraries
|
|
//
|
|
|
|
if (!InitLibs (hInstance, dwReason, lpReserved)) {
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Final initialization
|
|
//
|
|
|
|
if (!FinalInitRoutine ()) {
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
VOID
|
|
Terminate (
|
|
VOID
|
|
)
|
|
{
|
|
HINSTANCE hInstance;
|
|
DWORD dwReason;
|
|
PVOID lpReserved;
|
|
|
|
//
|
|
// Simulate DllMain
|
|
//
|
|
|
|
hInstance = GetModuleHandle (NULL);
|
|
dwReason = DLL_PROCESS_DETACH;
|
|
lpReserved = NULL;
|
|
|
|
//
|
|
// Call the cleanup routine that requires library APIs
|
|
//
|
|
|
|
FirstCleanupRoutine();
|
|
|
|
//
|
|
// Clean up all libraries
|
|
//
|
|
|
|
TerminateLibs (hInstance, dwReason, lpReserved);
|
|
|
|
//
|
|
// Do any remaining clean up
|
|
//
|
|
|
|
FinalCleanupRoutine();
|
|
|
|
}
|
|
|
|
|
|
VOID
|
|
HelpAndExit (
|
|
VOID
|
|
)
|
|
{
|
|
wprintf (L"Command Line Syntax:\n\n"
|
|
L"sharegen <sharename>\n\n"
|
|
L"<sharename> - Specifies the share to create\n"
|
|
);
|
|
exit (-1);
|
|
}
|
|
|
|
|
|
VOID
|
|
BuildMemDbTestData (
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SearchDomainsForUserAccounts (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
DoCreateShares (
|
|
VOID
|
|
);
|
|
|
|
|
|
INT
|
|
__cdecl
|
|
wmain (
|
|
INT argc,
|
|
WCHAR *argv[]
|
|
)
|
|
{
|
|
INT i;
|
|
PCWSTR ShareName = NULL;
|
|
PCWSTR p;
|
|
PCWSTR Path = L"C:\\TEMP";
|
|
PCWSTR Remark = L"ShareGen test share";
|
|
PCWSTR Password = L"";
|
|
DWORD Members;
|
|
GROWBUFFER NameList = GROWBUF_INIT;
|
|
|
|
for (i = 1 ; i < argc ; i++) {
|
|
if (argv[i][0] == '-' || argv[i][0] == '/') {
|
|
switch (tolower (argv[i][1])) {
|
|
case 'i':
|
|
if (!argv[i][2] && (i + 1) < argc) {
|
|
i++;
|
|
p = argv[i];
|
|
} else if (argv[i][2] == ':') {
|
|
p = &argv[i][3];
|
|
} else {
|
|
HelpAndExit();
|
|
}
|
|
break;
|
|
|
|
default:
|
|
HelpAndExit();
|
|
}
|
|
} else {
|
|
if (ShareName) {
|
|
HelpAndExit();
|
|
} else {
|
|
ShareName = argv[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!ShareName) {
|
|
HelpAndExit();
|
|
}
|
|
|
|
if (!Init()) {
|
|
wprintf (L"Unable to initialize!\n");
|
|
return 255;
|
|
}
|
|
|
|
//
|
|
// Generate data as it would be generated during the report phase
|
|
//
|
|
|
|
BuildMemDbTestData();
|
|
|
|
//
|
|
// Call the routines that do migration based on memdb
|
|
//
|
|
|
|
SearchDomainsForUserAccounts();
|
|
DoCreateShares();
|
|
|
|
Terminate();
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
typedef struct {
|
|
WCHAR UserName[64];
|
|
DWORD Permissions;
|
|
} USERATTRIBS, *PUSERATTRIBS;
|
|
|
|
VOID
|
|
pAddShare (
|
|
PCWSTR ShareName,
|
|
PCWSTR Remark,
|
|
PCWSTR Path,
|
|
DWORD AccessFlags,
|
|
PCWSTR RoPassword, OPTIONAL
|
|
PCWSTR RwPassword, OPTIONAL
|
|
PUSERATTRIBS UserList OPTIONAL
|
|
)
|
|
{
|
|
//
|
|
// Add each field to memdb
|
|
//
|
|
|
|
MemDbSetValueEx (
|
|
MEMDB_CATEGORY_NETSHARES,
|
|
ShareName,
|
|
MEMDB_FIELD_REMARK,
|
|
Remark,
|
|
0,
|
|
NULL
|
|
);
|
|
|
|
MemDbSetValueEx (
|
|
MEMDB_CATEGORY_NETSHARES,
|
|
ShareName,
|
|
MEMDB_FIELD_PATH,
|
|
Path,
|
|
0,
|
|
NULL
|
|
);
|
|
|
|
if (UserList) {
|
|
while (*UserList->UserName) {
|
|
|
|
MemDbSetValueEx (
|
|
MEMDB_CATEGORY_NETSHARES,
|
|
ShareName,
|
|
MEMDB_FIELD_ACCESS_LIST,
|
|
UserList->UserName,
|
|
UserList->Permissions,
|
|
NULL
|
|
);
|
|
|
|
UserList++;
|
|
}
|
|
|
|
AccessFlags |= SHI50F_ACLS;
|
|
}
|
|
|
|
MemDbSetValueEx (
|
|
MEMDB_CATEGORY_NETSHARES,
|
|
ShareName,
|
|
NULL,
|
|
NULL,
|
|
AccessFlags,
|
|
NULL
|
|
);
|
|
|
|
if (RoPassword) {
|
|
MemDbSetValueEx (
|
|
MEMDB_CATEGORY_NETSHARES,
|
|
ShareName,
|
|
MEMDB_FIELD_RO_PASSWORD,
|
|
RoPassword,
|
|
0,
|
|
NULL
|
|
);
|
|
}
|
|
|
|
if (RwPassword) {
|
|
MemDbSetValueEx (
|
|
MEMDB_CATEGORY_NETSHARES,
|
|
ShareName,
|
|
MEMDB_FIELD_RW_PASSWORD,
|
|
RwPassword,
|
|
0,
|
|
NULL
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
pAddUserToList (
|
|
IN OUT PGROWBUFFER List,
|
|
IN PCWSTR UserName,
|
|
IN DWORD Win9xAccessFlags
|
|
)
|
|
{
|
|
PUSERATTRIBS User;
|
|
|
|
User = (PUSERATTRIBS) GrowBuffer (List, sizeof (USERATTRIBS));
|
|
if (!User) {
|
|
wprintf (L"Can't alloc memory!\n");
|
|
exit (-1);
|
|
}
|
|
|
|
StringCopyW (User->UserName, UserName);
|
|
User->Permissions = Win9xAccessFlags;
|
|
|
|
if (*UserName) {
|
|
if (wcschr (UserName, L'\\')) {
|
|
MemDbSetValueEx (
|
|
MEMDB_CATEGORY_KNOWNDOMAIN,
|
|
User->UserName,
|
|
NULL,
|
|
NULL,
|
|
0,
|
|
NULL
|
|
);
|
|
} else {
|
|
MemDbSetValueEx (
|
|
MEMDB_CATEGORY_KNOWNDOMAIN,
|
|
L"",
|
|
!StringCompare (User->UserName, L"*") ? L"Everyone" : User->UserName,
|
|
NULL,
|
|
0,
|
|
NULL
|
|
);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
VOID
|
|
pAddShareLevelShare (
|
|
IN PCWSTR ShareName,
|
|
IN PCWSTR Remark,
|
|
IN PCWSTR Path,
|
|
IN DWORD Win9xAccessFlags,
|
|
IN PCWSTR RoPassword, OPTIONAL
|
|
IN PCWSTR RwPassword
|
|
)
|
|
{
|
|
//
|
|
// Add the share to memdb
|
|
//
|
|
|
|
pAddShare (
|
|
ShareName,
|
|
Remark,
|
|
Path,
|
|
Win9xAccessFlags,
|
|
RoPassword,
|
|
RwPassword,
|
|
NULL
|
|
);
|
|
}
|
|
|
|
VOID
|
|
pAddUserLevelShare (
|
|
IN PCWSTR ShareName,
|
|
IN PCWSTR Remark,
|
|
IN PCWSTR Path,
|
|
IN PCWSTR UserMultiSz
|
|
)
|
|
{
|
|
GROWBUFFER List = GROWBUF_INIT;
|
|
MULTISZ_ENUM e;
|
|
PWSTR p;
|
|
DWORD Win9xAccessFlags;
|
|
PWSTR DupStr;
|
|
PCWSTR q;
|
|
|
|
DupStr = DuplicateText (UserMultiSz);
|
|
p = wcschr (DupStr, L'|');
|
|
while (p) {
|
|
*p = 0;
|
|
p = wcschr (p + 1, L'|');
|
|
}
|
|
|
|
|
|
//
|
|
// Convert multi-sz of user names (with optional attributes)
|
|
// into simple structure
|
|
//
|
|
|
|
q = DupStr;
|
|
while (*q) {
|
|
|
|
p = wcschr (q, L'=');
|
|
|
|
if (p) {
|
|
*p = 0;
|
|
p++;
|
|
Win9xAccessFlags = _wtoi (p);
|
|
} else {
|
|
p = (PWSTR) q;
|
|
Win9xAccessFlags = 0;
|
|
}
|
|
|
|
pAddUserToList (&List, q, Win9xAccessFlags);
|
|
|
|
q = GetEndOfStringW (p) + 1;
|
|
}
|
|
|
|
pAddUserToList (&List, L"", 0);
|
|
|
|
//
|
|
// Add the share to memdb
|
|
//
|
|
|
|
pAddShare (
|
|
ShareName,
|
|
Remark,
|
|
Path,
|
|
0,
|
|
NULL,
|
|
NULL,
|
|
(PUSERATTRIBS) List.Buf
|
|
);
|
|
|
|
FreeGrowBuffer (&List);
|
|
FreeText (DupStr);
|
|
}
|
|
|
|
|
|
VOID
|
|
BuildMemDbTestData (
|
|
VOID
|
|
)
|
|
{
|
|
WCHAR AccessStr[1024];
|
|
|
|
#if 0
|
|
pAddShareLevelShare (L"TestRO", L"sharegen test", L"c:\\temp", SHI50F_RDONLY, NULL, NULL);
|
|
pAddShareLevelShare (L"TestRW", L"sharegen test", L"c:\\temp", SHI50F_FULL, NULL, NULL);
|
|
pAddShareLevelShare (L"TestNone", L"sharegen test", L"c:\\temp", 0, NULL, NULL);
|
|
|
|
wsprintfW (AccessStr, L"read=%u|write=%u|all=%u|mrnone=0|", W95_GENERIC_READ, W95_GENERIC_WRITE, W95_GENERIC_FULL);
|
|
pAddUserLevelShare (L"User1", L"remark", L"c:\\temp", AccessStr);
|
|
|
|
#endif
|
|
|
|
wsprintfW (AccessStr, L"*=%u|", 0xb7);
|
|
pAddUserLevelShare (L"User2", L"remark", L"c:\\temp", AccessStr);
|
|
}
|
|
|