207 lines
4.1 KiB
C
207 lines
4.1 KiB
C
|
|
|||
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1993-1994 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
network.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the set of routines that support updating network
|
|||
|
drive shares when adding and deleting drive letters.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Bob Rinne (bobri) 12/26/94
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
User process.
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "fdisk.h"
|
|||
|
#include "shellapi.h"
|
|||
|
#include <winbase.h>
|
|||
|
#include <string.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <malloc.h>
|
|||
|
#include <lm.h>
|
|||
|
|
|||
|
// Data area to hold the permissions that are to be assigned to the
|
|||
|
// administrative shares C$, D$, etc. This is obtained during initialization
|
|||
|
// and not changed, just used when a new administrator share needes to
|
|||
|
// be made.
|
|||
|
|
|||
|
LPBYTE ShareInformationBuffer;
|
|||
|
|
|||
|
// Only perform network actions if this value is true. This value
|
|||
|
// is set if the initialization of this module completes successfully.
|
|||
|
|
|||
|
BOOLEAN NetworkEnabled;
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
NetworkInitialize(
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Intialize the permissions constants for any new administrator
|
|||
|
driver letter shares.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
WCHAR shareName[4];
|
|||
|
NET_API_STATUS status;
|
|||
|
PSHARE_INFO_502 info;
|
|||
|
LPTSTR string;
|
|||
|
|
|||
|
shareName[1] = (WCHAR) '$';
|
|||
|
shareName[2] = (WCHAR) 0;
|
|||
|
|
|||
|
for (shareName[0] = (WCHAR) 'C'; shareName[0] <= (WCHAR) 'Z'; shareName[0]++) {
|
|||
|
|
|||
|
// Since windisk is still built as a non-unicode application,
|
|||
|
// the parameter "shareName" must be unicode, but the prototype
|
|||
|
// specifies that it is a (char *). Do the typecast to remove
|
|||
|
// warnings.
|
|||
|
|
|||
|
status = NetShareGetInfo(NULL,
|
|||
|
(char *) shareName,
|
|||
|
502,
|
|||
|
&ShareInformationBuffer);
|
|||
|
if (status == NERR_Success) {
|
|||
|
|
|||
|
// Update the remarks and password to be NULL.
|
|||
|
|
|||
|
info = (PSHARE_INFO_502) ShareInformationBuffer;
|
|||
|
string = info->shi502_remark;
|
|||
|
if (string) {
|
|||
|
*string = (TCHAR) 0;
|
|||
|
}
|
|||
|
string = info->shi502_passwd;
|
|||
|
if (string) {
|
|||
|
*string = (TCHAR) 0;
|
|||
|
}
|
|||
|
|
|||
|
// Network shares are to be updated.
|
|||
|
|
|||
|
NetworkEnabled = TRUE;
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Can't find any network shares - do not attempt updates
|
|||
|
// of administrator shares.
|
|||
|
|
|||
|
NetworkEnabled = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
NetworkShare(
|
|||
|
IN LPCTSTR DriveLetter
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Given a drive letter, construct the default administrator share
|
|||
|
for the letter. This is the C$, D$, etc share for the drive.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DriveLetter - the drive letter to share.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
NET_API_STATUS status;
|
|||
|
PSHARE_INFO_502 info;
|
|||
|
LPTSTR string;
|
|||
|
|
|||
|
if (NetworkEnabled) {
|
|||
|
info = (PSHARE_INFO_502) ShareInformationBuffer;
|
|||
|
|
|||
|
// Set up the new network name.
|
|||
|
|
|||
|
string = info->shi502_netname;
|
|||
|
*string = *DriveLetter;
|
|||
|
|
|||
|
// Set up the path. All that need be added is the drive letter
|
|||
|
// the rest of the path (":\") is already in the structure.
|
|||
|
|
|||
|
string = info->shi502_path;
|
|||
|
*string = *DriveLetter;
|
|||
|
|
|||
|
status = NetShareAdd(NULL,
|
|||
|
502,
|
|||
|
ShareInformationBuffer,
|
|||
|
NULL);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
NetworkRemoveShare(
|
|||
|
IN LPCTSTR DriveLetter
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Remove the administrator share for the given letter.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DriveLetter - the drive letter to share.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
NET_API_STATUS status;
|
|||
|
WCHAR shareName[4];
|
|||
|
|
|||
|
if (NetworkEnabled) {
|
|||
|
shareName[0] = (WCHAR) *DriveLetter;
|
|||
|
shareName[1] = (WCHAR) '$';
|
|||
|
shareName[2] = (WCHAR) 0;
|
|||
|
|
|||
|
// Since windisk is still built as a non-unicode application,
|
|||
|
// the parameter "shareName" must be unicode, but the prototype
|
|||
|
// specifies that it is a (char *). Do the typecast to remove
|
|||
|
// warnings.
|
|||
|
|
|||
|
status = NetShareDel(NULL,
|
|||
|
(char *) shareName,
|
|||
|
0);
|
|||
|
}
|
|||
|
}
|