mirror of
https://github.com/reactos/reactos.git
synced 2024-09-28 05:26:58 +00:00
Finished drive letter assignment
Implemented WinNT compatible ARC path (boot.ini) svn path=/trunk/; revision=1315
This commit is contained in:
parent
6c2d255207
commit
1a10e72f31
|
@ -1,4 +1,4 @@
|
|||
/* $Id: ide.c,v 1.33 2000/08/24 19:15:20 ekohl Exp $
|
||||
/* $Id: ide.c,v 1.34 2000/08/25 15:56:24 ekohl Exp $
|
||||
*
|
||||
* IDE.C - IDE Disk driver
|
||||
* written by Rex Jolliff
|
||||
|
@ -925,13 +925,13 @@ IDECreateDevice(IN PDRIVER_OBJECT DriverObject,
|
|||
}
|
||||
RtlInitUnicodeString (&ArcName,
|
||||
ArcNameBuffer);
|
||||
DPRINT1("%wZ ==> %wZ\n", &ArcName, &DeviceName);
|
||||
DPRINT("%wZ ==> %wZ\n", &ArcName, &DeviceName);
|
||||
RC = IoAssignArcName (&ArcName,
|
||||
&DeviceName);
|
||||
if (!NT_SUCCESS(RC))
|
||||
{
|
||||
DPRINT1("IoAssignArcName (%wZ) failed (Status %x)\n",
|
||||
&ArcName, RC);
|
||||
DPRINT("IoAssignArcName (%wZ) failed (Status %x)\n",
|
||||
&ArcName, RC);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: volume.c,v 1.17 2000/06/29 23:35:24 dwelch Exp $
|
||||
/* $Id: volume.c,v 1.18 2000/08/25 15:52:56 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS system libraries
|
||||
|
@ -6,7 +6,7 @@
|
|||
* PURPOSE: File volume functions
|
||||
* PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
|
||||
* Erik Bos, Alexandre Julliard :
|
||||
* DRIVE_IsValid, GetLogicalDriveStringsA,
|
||||
* GetLogicalDriveStringsA,
|
||||
* GetLogicalDriveStringsW, GetLogicalDrives
|
||||
* UPDATE HISTORY:
|
||||
* Created 01/11/98
|
||||
|
@ -20,6 +20,7 @@
|
|||
*/
|
||||
|
||||
#include <ddk/ntddk.h>
|
||||
#include <napi/shared_data.h>
|
||||
#include <windows.h>
|
||||
#include <ntos/minmax.h>
|
||||
|
||||
|
@ -31,68 +32,62 @@
|
|||
#define MAX_DOS_DRIVES 26
|
||||
|
||||
|
||||
int DRIVE_IsValid( int drive )
|
||||
{
|
||||
char Drives[4];
|
||||
Drives[0] = 'A';
|
||||
Drives[1] = ':';
|
||||
Drives[2] = '\\';
|
||||
Drives[3] = 0;
|
||||
|
||||
Drives[0] = 'A' + drive -1;
|
||||
if ((drive < 0) || (drive >= MAX_DOS_DRIVES)) return 0;
|
||||
if ( CreateFileA(Drives,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS|FILE_ATTRIBUTE_DIRECTORY,NULL) == INVALID_HANDLE_VALUE ) {
|
||||
return 0;
|
||||
}
|
||||
return drive;
|
||||
|
||||
}
|
||||
|
||||
|
||||
DWORD
|
||||
STDCALL
|
||||
GetLogicalDriveStringsA(
|
||||
DWORD nBufferLength,
|
||||
LPSTR lpBuffer
|
||||
)
|
||||
GetLogicalDriveStringsA(DWORD nBufferLength,
|
||||
LPSTR lpBuffer)
|
||||
{
|
||||
int drive, count;
|
||||
DWORD drive, count;
|
||||
DWORD dwDriveMap;
|
||||
|
||||
for (drive = count = 0; drive < MAX_DOS_DRIVES; drive++)
|
||||
if (DRIVE_IsValid(drive)) count++;
|
||||
if (count * 4 * sizeof(char) <= nBufferLength)
|
||||
{
|
||||
LPSTR p = lpBuffer;
|
||||
for (drive = 0; drive < MAX_DOS_DRIVES; drive++)
|
||||
if (DRIVE_IsValid(drive))
|
||||
dwDriveMap = ((PKUSER_SHARED_DATA)USER_SHARED_DATA_BASE)->DosDeviceMap;
|
||||
|
||||
for (drive = count = 0; drive < MAX_DOS_DRIVES; drive++)
|
||||
{
|
||||
if (dwDriveMap & (1<<drive))
|
||||
count++;
|
||||
}
|
||||
|
||||
|
||||
if (count * 4 * sizeof(char) <= nBufferLength)
|
||||
{
|
||||
LPSTR p = lpBuffer;
|
||||
|
||||
for (drive = 0; drive < MAX_DOS_DRIVES; drive++)
|
||||
if (dwDriveMap & (1<<drive))
|
||||
{
|
||||
*p++ = 'A' + drive;
|
||||
*p++ = ':';
|
||||
*p++ = '\\';
|
||||
*p++ = '\0';
|
||||
}
|
||||
*p = '\0';
|
||||
*p = '\0';
|
||||
}
|
||||
return count * 4 * sizeof(char);
|
||||
return (count * 4 * sizeof(char));
|
||||
}
|
||||
|
||||
|
||||
DWORD
|
||||
STDCALL
|
||||
GetLogicalDriveStringsW(
|
||||
DWORD nBufferLength,
|
||||
LPWSTR lpBuffer
|
||||
)
|
||||
GetLogicalDriveStringsW(DWORD nBufferLength,
|
||||
LPWSTR lpBuffer)
|
||||
{
|
||||
int drive, count;
|
||||
DWORD drive, count;
|
||||
DWORD dwDriveMap;
|
||||
|
||||
dwDriveMap = ((PKUSER_SHARED_DATA)USER_SHARED_DATA_BASE)->DosDeviceMap;
|
||||
|
||||
for (drive = count = 0; drive < MAX_DOS_DRIVES; drive++)
|
||||
{
|
||||
if (dwDriveMap & (1<<drive))
|
||||
count++;
|
||||
}
|
||||
|
||||
for (drive = count = 0; drive < MAX_DOS_DRIVES; drive++)
|
||||
if (DRIVE_IsValid(drive)) count++;
|
||||
if (count * 4 * sizeof(WCHAR) <= nBufferLength)
|
||||
{
|
||||
LPWSTR p = lpBuffer;
|
||||
for (drive = 0; drive < MAX_DOS_DRIVES; drive++)
|
||||
if (DRIVE_IsValid(drive))
|
||||
if (dwDriveMap & (1<<drive))
|
||||
{
|
||||
*p++ = (WCHAR)('A' + drive);
|
||||
*p++ = (WCHAR)':';
|
||||
|
@ -101,7 +96,7 @@ GetLogicalDriveStringsW(
|
|||
}
|
||||
*p = (WCHAR)'\0';
|
||||
}
|
||||
return count * 4 * sizeof(WCHAR);
|
||||
return (count * 4 * sizeof(WCHAR));
|
||||
}
|
||||
|
||||
|
||||
|
@ -109,12 +104,7 @@ DWORD
|
|||
STDCALL
|
||||
GetLogicalDrives(VOID)
|
||||
{
|
||||
DWORD ret = 0;
|
||||
int drive;
|
||||
|
||||
for (drive = 0; drive < MAX_DOS_DRIVES; drive++)
|
||||
if (DRIVE_IsValid(drive)) ret |= (1 << drive);
|
||||
return ret;
|
||||
return (((PKUSER_SHARED_DATA)USER_SHARED_DATA_BASE)->DosDeviceMap);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: xhaldrv.c,v 1.6 2000/08/24 19:09:12 ekohl Exp $
|
||||
/* $Id: xhaldrv.c,v 1.7 2000/08/25 15:55:02 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -9,14 +9,6 @@
|
|||
* Created 19/06/2000
|
||||
*/
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* - Read disk signature in xHalIoReadPartitionTable().
|
||||
* - Build correct system path from nt device name or arc name.
|
||||
* For example: \Device\Harddisk0\Partition1\reactos ==> C:\reactos
|
||||
* Or: multi(0)disk(0)rdisk(0)partition(1)\reactos ==> C:\reactos
|
||||
*/
|
||||
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <ddk/ntddk.h>
|
||||
|
@ -32,6 +24,7 @@
|
|||
#define PARTITION_MAGIC 0xaa55
|
||||
#define PART_MAGIC_OFFSET 0x01fe
|
||||
#define PARTITION_OFFSET 0x01be
|
||||
#define SIGNATURE_OFFSET 0x01b8
|
||||
#define PARTITION_TBL_SIZE 4
|
||||
|
||||
#define IsUsablePartition(P) \
|
||||
|
@ -676,10 +669,9 @@ xHalIoReadPartitionTable (
|
|||
}
|
||||
#endif
|
||||
|
||||
/* FIXME: Set the correct value */
|
||||
if (ExtendedFound == FALSE);
|
||||
{
|
||||
LayoutBuffer->Signature = 0xdeadbeef;
|
||||
LayoutBuffer->Signature = *((PULONG)(SectorBuffer + SIGNATURE_OFFSET));
|
||||
}
|
||||
|
||||
ExtendedFound = FALSE;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: main.c,v 1.58 2000/08/24 19:10:27 ekohl Exp $
|
||||
/* $Id: main.c,v 1.59 2000/08/25 15:54:11 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -29,7 +29,7 @@
|
|||
#include <internal/i386/segment.h>
|
||||
#include <napi/shared_data.h>
|
||||
|
||||
//#define NDEBUG
|
||||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
/* DATA *********************************************************************/
|
||||
|
@ -161,17 +161,188 @@ CreateSystemRootLink (PCSZ ParameterLine)
|
|||
*/
|
||||
}
|
||||
|
||||
|
||||
static VOID
|
||||
InitSystemSharedUserPage (VOID)
|
||||
InitSystemSharedUserPage (PCSZ ParameterLine)
|
||||
{
|
||||
PKUSER_SHARED_DATA SharedPage;
|
||||
|
||||
UNICODE_STRING ArcDeviceName;
|
||||
UNICODE_STRING ArcName;
|
||||
UNICODE_STRING BootPath;
|
||||
UNICODE_STRING DriveDeviceName;
|
||||
UNICODE_STRING DriveName;
|
||||
WCHAR DriveNameBuffer[20];
|
||||
PCHAR ParamBuffer;
|
||||
PWCHAR ArcNameBuffer;
|
||||
PCHAR p;
|
||||
NTSTATUS Status;
|
||||
ULONG Length;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
HANDLE Handle;
|
||||
ULONG i;
|
||||
BOOLEAN BootDriveFound;
|
||||
|
||||
SharedPage = (PKUSER_SHARED_DATA)KERNEL_SHARED_DATA_BASE;
|
||||
|
||||
/* set system root in shared user page */
|
||||
wcscpy (SharedPage->NtSystemRoot, L"C:\\reactos");
|
||||
|
||||
SharedPage->DosDeviceMap = 0;
|
||||
SharedPage->NtProductType = NtProductWinNt;
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
SharedPage->DosDeviceDriveType[i] = 0;
|
||||
}
|
||||
|
||||
BootDriveFound = FALSE;
|
||||
|
||||
/*
|
||||
* Retrieve the current dos system path
|
||||
* (e.g.: C:\reactos) from the given arc path
|
||||
* (e.g.: multi(0)disk(0)rdisk(0)partititon(1)\reactos)
|
||||
* Format: "<arc_name>\<path> [options...]"
|
||||
*/
|
||||
|
||||
/* create local parameter line copy */
|
||||
ParamBuffer = ExAllocatePool (PagedPool, 256);
|
||||
strcpy (ParamBuffer, (char *)ParameterLine);
|
||||
DPRINT("%s\n", ParamBuffer);
|
||||
|
||||
/* cut options off */
|
||||
p = strchr (ParamBuffer, ' ');
|
||||
if (p)
|
||||
{
|
||||
*p = 0;
|
||||
}
|
||||
DPRINT("%s\n", ParamBuffer);
|
||||
|
||||
/* extract path */
|
||||
p = strchr (ParamBuffer, '\\');
|
||||
if (p)
|
||||
{
|
||||
DPRINT("Boot path: %s\n", p);
|
||||
RtlCreateUnicodeStringFromAsciiz (&BootPath, p);
|
||||
*p = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT("Boot path: %s\n", "\\");
|
||||
RtlCreateUnicodeStringFromAsciiz (&BootPath, "\\");
|
||||
}
|
||||
DPRINT("Arc name: %s\n", ParamBuffer);
|
||||
|
||||
/* Only arc name left - build full arc name */
|
||||
ArcNameBuffer = ExAllocatePool (PagedPool, 256 * sizeof(WCHAR));
|
||||
swprintf (ArcNameBuffer, L"\\ArcName\\%S", ParamBuffer);
|
||||
RtlInitUnicodeString (&ArcName, ArcNameBuffer);
|
||||
DPRINT("Arc name: %wZ\n", &ArcName);
|
||||
|
||||
/* free ParamBuffer */
|
||||
ExFreePool (ParamBuffer);
|
||||
|
||||
/* allocate arc device name string */
|
||||
ArcDeviceName.Length = 0;
|
||||
ArcDeviceName.MaximumLength = 256 * sizeof(WCHAR);
|
||||
ArcDeviceName.Buffer = ExAllocatePool (PagedPool, 256 * sizeof(WCHAR));
|
||||
|
||||
InitializeObjectAttributes (&ObjectAttributes,
|
||||
&ArcName,
|
||||
0,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
Status = NtOpenSymbolicLinkObject (&Handle,
|
||||
SYMBOLIC_LINK_ALL_ACCESS,
|
||||
&ObjectAttributes);
|
||||
RtlFreeUnicodeString (&ArcName);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
RtlFreeUnicodeString (&BootPath);
|
||||
RtlFreeUnicodeString (&ArcDeviceName);
|
||||
DbgPrint("NtOpenSymbolicLinkObject() failed (Status %x)\n",
|
||||
Status);
|
||||
|
||||
KeBugCheck (0x0);
|
||||
}
|
||||
|
||||
Status = NtQuerySymbolicLinkObject (Handle,
|
||||
&ArcDeviceName,
|
||||
&Length);
|
||||
NtClose (Handle);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
RtlFreeUnicodeString (&BootPath);
|
||||
RtlFreeUnicodeString (&ArcDeviceName);
|
||||
DbgPrint("NtQuerySymbolicObject() failed (Status %x)\n",
|
||||
Status);
|
||||
|
||||
KeBugCheck (0x0);
|
||||
}
|
||||
DPRINT("Length: %lu ArcDeviceName: %wZ\n", Length, &ArcDeviceName);
|
||||
|
||||
|
||||
/* allocate device name string */
|
||||
DriveDeviceName.Length = 0;
|
||||
DriveDeviceName.MaximumLength = 256 * sizeof(WCHAR);
|
||||
DriveDeviceName.Buffer = ExAllocatePool (PagedPool, 256 * sizeof(WCHAR));
|
||||
|
||||
for (i = 0; i < 26; i++)
|
||||
{
|
||||
swprintf (DriveNameBuffer, L"\\??\\%C:", 'A' + i);
|
||||
RtlInitUnicodeString (&DriveName,
|
||||
DriveNameBuffer);
|
||||
|
||||
InitializeObjectAttributes (&ObjectAttributes,
|
||||
&DriveName,
|
||||
0,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
Status = NtOpenSymbolicLinkObject (&Handle,
|
||||
SYMBOLIC_LINK_ALL_ACCESS,
|
||||
&ObjectAttributes);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("Failed to open link %wZ\n",
|
||||
&DriveName);
|
||||
continue;
|
||||
}
|
||||
|
||||
Status = NtQuerySymbolicLinkObject (Handle,
|
||||
&DriveDeviceName,
|
||||
&Length);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("Failed query open link %wZ\n",
|
||||
&DriveName);
|
||||
continue;
|
||||
}
|
||||
DPRINT("Opened link: %wZ ==> %wZ\n",
|
||||
&DriveName, &DriveDeviceName);
|
||||
|
||||
if (!RtlCompareUnicodeString (&ArcDeviceName, &DriveDeviceName, FALSE))
|
||||
{
|
||||
DPRINT("DOS Boot path: %c:%wZ\n", 'A' + i, &BootPath);
|
||||
swprintf (SharedPage->NtSystemRoot,
|
||||
L"%C:%wZ", 'A' + i, &BootPath);
|
||||
|
||||
BootDriveFound = TRUE;
|
||||
}
|
||||
|
||||
NtClose (Handle);
|
||||
|
||||
/* set bit in dos drives bitmap (drive available) */
|
||||
SharedPage->DosDeviceMap |= (1<<i);
|
||||
}
|
||||
|
||||
RtlFreeUnicodeString (&BootPath);
|
||||
RtlFreeUnicodeString (&DriveDeviceName);
|
||||
RtlFreeUnicodeString (&ArcDeviceName);
|
||||
|
||||
DPRINT("DosDeviceMap: 0x%x\n", SharedPage->DosDeviceMap);
|
||||
|
||||
if (BootDriveFound == FALSE)
|
||||
{
|
||||
DbgPrint("No system drive found!\n");
|
||||
KeBugCheck (0x0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -307,8 +478,11 @@ void _main (PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
NULL,
|
||||
NULL);
|
||||
|
||||
/* initialize shared user page */
|
||||
InitSystemSharedUserPage ();
|
||||
/*
|
||||
* Initialize shared user page:
|
||||
* - set dos system path, dos device map, etc.
|
||||
*/
|
||||
InitSystemSharedUserPage (KeLoaderBlock.kernel_parameters);
|
||||
|
||||
/*
|
||||
* Launch initial process
|
||||
|
|
Loading…
Reference in a new issue