167 lines
3.3 KiB
C
167 lines
3.3 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1998 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
map.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module implements the drive mapping command.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Wesley Witt (wesw) 21-Oct-1998
|
||
|
Ted Miller (tedm) 21-Oct-1998
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "cmdcons.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
|
||
|
LPWSTR FsTypes[] =
|
||
|
{
|
||
|
L" ",
|
||
|
L"NEW ",
|
||
|
L"FAT16",
|
||
|
L"NTFS ",
|
||
|
L"FAT32",
|
||
|
L" ",
|
||
|
L" "
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
RcDiskRegionEnum(
|
||
|
IN PPARTITIONED_DISK Disk,
|
||
|
IN PDISK_REGION Region,
|
||
|
IN ULONG_PTR UseArcNames
|
||
|
)
|
||
|
{
|
||
|
ULONGLONG RegionSizeMB;
|
||
|
WCHAR ArcName[256];
|
||
|
|
||
|
if (!SPPT_IS_REGION_PARTITIONED(Region) ||
|
||
|
(Region->ExtendedType == EPTContainerPartition)) {
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
if (UseArcNames) {
|
||
|
SpArcNameFromRegion(
|
||
|
Region,
|
||
|
ArcName,
|
||
|
sizeof(ArcName),
|
||
|
PartitionOrdinalCurrent,
|
||
|
PrimaryArcPath
|
||
|
);
|
||
|
} else {
|
||
|
SpNtNameFromRegion(
|
||
|
Region,
|
||
|
ArcName,
|
||
|
sizeof(ArcName),
|
||
|
PartitionOrdinalCurrent
|
||
|
);
|
||
|
}
|
||
|
|
||
|
RegionSizeMB = SpPtSectorCountToMB(Disk->HardDisk, Region->SectorCount);
|
||
|
|
||
|
RcMessageOut(
|
||
|
MSG_MAP_ENTRY,
|
||
|
Region->DriveLetter == 0 ? L'?' : Region->DriveLetter,
|
||
|
Region->DriveLetter == 0 ? L' ' : L':',
|
||
|
FsTypes[Region->Filesystem],
|
||
|
(ULONG)RegionSizeMB,
|
||
|
ArcName
|
||
|
);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
GetDriveLetterLinkTarget(
|
||
|
IN PWSTR SourceNameStr,
|
||
|
OUT PWSTR *LinkTarget
|
||
|
)
|
||
|
{
|
||
|
static WCHAR targetNameBuffer[256];
|
||
|
|
||
|
NTSTATUS status;
|
||
|
UNICODE_STRING sourceName;
|
||
|
UNICODE_STRING targetName;
|
||
|
OBJECT_ATTRIBUTES oa;
|
||
|
HANDLE handle;
|
||
|
|
||
|
|
||
|
RtlInitUnicodeString(&sourceName, SourceNameStr);
|
||
|
|
||
|
InitializeObjectAttributes(&oa, &sourceName, OBJ_CASE_INSENSITIVE, NULL, NULL);
|
||
|
|
||
|
status = ZwOpenSymbolicLinkObject(&handle, READ_CONTROL | SYMBOLIC_LINK_QUERY, &oa);
|
||
|
|
||
|
if (NT_SUCCESS(status))
|
||
|
{
|
||
|
RtlZeroMemory(targetNameBuffer, sizeof(targetNameBuffer));
|
||
|
targetName.Buffer = targetNameBuffer;
|
||
|
targetName.MaximumLength = sizeof(targetNameBuffer);
|
||
|
|
||
|
status = ZwQuerySymbolicLinkObject(handle, &targetName, NULL);
|
||
|
NtClose(handle);
|
||
|
}
|
||
|
|
||
|
if (NT_SUCCESS(status))
|
||
|
{
|
||
|
*LinkTarget = targetName.Buffer;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
*LinkTarget = NULL;
|
||
|
}
|
||
|
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
|
||
|
ULONG
|
||
|
RcCmdDriveMap(
|
||
|
IN PTOKENIZED_LINE TokenizedLine
|
||
|
)
|
||
|
{
|
||
|
ULONG i;
|
||
|
LPWSTR s;
|
||
|
LPWSTR p;
|
||
|
WCHAR buf[128];
|
||
|
|
||
|
|
||
|
if (RcCmdParseHelp( TokenizedLine, MSG_MAP_HELP )) {
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
RcTextOut( L"\r\n" );
|
||
|
|
||
|
if (TokenizedLine->TokenCount == 2 && _wcsicmp( TokenizedLine->Tokens->Next->String, L"arc" ) == 0) {
|
||
|
SpEnumerateDiskRegions( (PSPENUMERATEDISKREGIONS)RcDiskRegionEnum, 1 );
|
||
|
} else {
|
||
|
SpEnumerateDiskRegions( (PSPENUMERATEDISKREGIONS)RcDiskRegionEnum, 0 );
|
||
|
}
|
||
|
|
||
|
for (i=0; i<26; i++) {
|
||
|
swprintf( buf, L"\\DosDevices\\%c:",i+L'A');
|
||
|
if (RcIsFileOnCDROM(buf) == STATUS_SUCCESS ||
|
||
|
RcIsFileOnFloppy(buf) == STATUS_SUCCESS
|
||
|
|| RcIsNetworkDrive(buf) == STATUS_SUCCESS
|
||
|
)
|
||
|
{
|
||
|
GetDriveLetterLinkTarget( buf, &s );
|
||
|
RcMessageOut( MSG_MAP_ENTRY2, buf[12], s );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 1;
|
||
|
}
|