From 40473b6aba5758f936c2da93d46878ab0e33adc2 Mon Sep 17 00:00:00 2001 From: Rex Jolliff Date: Sun, 13 Sep 1998 15:55:55 +0000 Subject: [PATCH] This commit was generated by cvs2svn to compensate for changes in r39, which included commits to RCS files with non-trunk default branches. svn path=/trunk/; revision=40 --- reactos/include/ddk/iodef.h | 6 + reactos/include/ddk/iofuncs.h | 2 + reactos/include/ddk/iotypes.h | 77 ++++------- reactos/include/ddk/ntddk.h | 2 +- reactos/include/ddk/obfuncs.h | 2 +- reactos/include/ddk/obtypes.h | 19 ++- reactos/include/ddk/setypes.h | 6 + reactos/include/ddk/status.h | 7 +- reactos/include/ddk/zw.h | 52 +++---- reactos/include/internal/debug.h | 7 + reactos/include/internal/mm.h | 21 ++- reactos/include/internal/module.h | 3 +- reactos/include/internal/version.h | 4 +- reactos/ntoskrnl/exports.lst | 2 + reactos/ntoskrnl/hal/x86/exp.c | 2 +- reactos/ntoskrnl/hal/x86/printk.c | 8 +- reactos/ntoskrnl/hal/x86/thread.c | 2 +- reactos/ntoskrnl/io/create.c | 104 +++++++++++--- reactos/ntoskrnl/io/device.c | 57 ++++++-- reactos/ntoskrnl/io/fs.c | 40 +++++- reactos/ntoskrnl/io/iomgr.c | 20 +-- reactos/ntoskrnl/io/symlink.c | 93 ++++++++++++- reactos/ntoskrnl/ke/exports.c | 4 + reactos/ntoskrnl/mm/mdl.c | 3 +- reactos/ntoskrnl/mm/special.c | 2 +- reactos/ntoskrnl/mm/virtual.c | 33 +++-- reactos/ntoskrnl/ob/handle.c | 54 +++++--- reactos/ntoskrnl/ob/namespc.c | 213 +++++++++++++++++------------ reactos/ntoskrnl/ob/object.c | 13 +- reactos/ntoskrnl/ps/process.c | 10 +- reactos/ntoskrnl/ps/psmgr.c | 5 +- reactos/ntoskrnl/ps/thread.c | 6 +- reactos/ntoskrnl/rtl/unicode.c | 11 +- reactos/ntoskrnl/rtl/vsprintf.c | 19 ++- reactos/ntoskrnl/tst/sshell.c | 49 +++---- reactos/rules.mak | 2 +- 36 files changed, 658 insertions(+), 302 deletions(-) diff --git a/reactos/include/ddk/iodef.h b/reactos/include/ddk/iodef.h index ec064340461..194c8d0367a 100644 --- a/reactos/include/ddk/iodef.h +++ b/reactos/include/ddk/iodef.h @@ -215,6 +215,7 @@ enum FILE_DEVICE_WAVE_IN, FILE_DEVICE_WAVE_OUT, FILE_DEVICE_8042_PORT, + FILE_DEVICE_FILE_SYSTEM, /* * Values beyond this are reserved for ISVs @@ -298,4 +299,9 @@ enum FILE_DOES_NOT_EXIST, }; +#define IRP_MN_USER_FS_REQUEST 0x00 +#define IRP_MN_MOUNT_VOLUME 0x01 +#define IRP_MN_VERIFY_VOLUME 0x02 +#define IRP_MN_LOAD_FILE_SYSTEM 0x03 + #endif diff --git a/reactos/include/ddk/iofuncs.h b/reactos/include/ddk/iofuncs.h index 02a927a97d1..a3f2eadea29 100644 --- a/reactos/include/ddk/iofuncs.h +++ b/reactos/include/ddk/iofuncs.h @@ -521,3 +521,5 @@ IN ULONG Length, OUT PVOID FileInformation, OUT PULONG ReturnedLength ); +VOID IoRegisterFileSystem(PDEVICE_OBJECT DeviceObject); +PDEVICE_OBJECT IoGetAttachedDevice(PDEVICE_OBJECT DeviceObject); diff --git a/reactos/include/ddk/iotypes.h b/reactos/include/ddk/iotypes.h index c7ce1961178..3ea7206a98f 100644 --- a/reactos/include/ddk/iotypes.h +++ b/reactos/include/ddk/iotypes.h @@ -75,51 +75,38 @@ typedef struct _IO_TIMER KDPC dpc; } IO_TIMER, *PIO_TIMER; +typedef struct _IO_SECURITY_CONTEXT +{ + PSECURITY_QUALITY_OF_SERVICE SecurityQos; + PACCESS_STATE AccessState; + ACCESS_MASK DesiredAccess; + ULONG FullCreateOptions; +} IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT; + /* * PURPOSE: IRP stack location */ typedef struct _IO_STACK_LOCATION { - /* - * Type of request - */ UCHAR MajorFunction; - - /* - * Further information about request type - */ - UCHAR MinorFunction; - - /* - * - */ - UCHAR Flags; - - /* - * FUNCTION: Various flags including for the io completion routine - */ + UCHAR MinorFunction; + UCHAR Flags; UCHAR Control; - /* - * Parameters for request - */ union { struct { - /* - * Number of bytes to be transferrred - */ + PIO_SECURITY_CONTEXT SecurityContext; + ULONG Options; + USHORT FileAttributes; + USHORT ShareAccess; + ULONG EaLength; + } Create; + struct + { ULONG Length; - - /* - * Possibly used to sort incoming request (to be documented) - */ ULONG Key; - - /* - * Optional starting offset for read - */ LARGE_INTEGER ByteOffset; } Read; struct @@ -135,26 +122,18 @@ typedef struct _IO_STACK_LOCATION ULONG IoControlCode; PVOID Type3InputBuffer; } DeviceIoControl; - + struct + { + struct _VPB* Vpb; + struct _DEVICE_OBJECT* DeviceObject; + } Mount; } Parameters; - /* - * PURPOSE: Completion routine - * NOTE: If this is the nth stack location (where the 1st is passed to the - * highest level driver) then this is the completion routine set by - * the (n-1)th driver - */ PIO_COMPLETION_ROUTINE CompletionRoutine; PVOID CompletionContext; - /* - * Driver created device object representing the target device - */ struct _DEVICE_OBJECT* DeviceObject; - /* - * File object (if any) associated with DeviceObject - */ struct _FILE_OBJECT* FileObject; } IO_STACK_LOCATION, *PIO_STACK_LOCATION; @@ -295,10 +274,15 @@ typedef struct _IRP KAPC Apc; ULONG CompletionKey; } Tail; - ULONG CurrentLocation; + CHAR StackCount; + CHAR CurrentLocation; IO_STACK_LOCATION Stack[1]; } IRP, *PIRP; +#define VPB_MOUNTED 0x00000001 +#define VPB_LOCKED 0x00000002 +#define VPB_PERSISTENT 0x00000004 +#define VPB_REMOVE_PENDING 0x00000008 typedef struct _VPB { @@ -377,9 +361,6 @@ typedef struct _DRIVER_EXTENSION typedef struct _DRIVER_OBJECT { - /* - * PURPOSE: Magic values for debugging - */ CSHORT Type; CSHORT Size; PDEVICE_OBJECT DeviceObject; diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index 70278e8c84e..835171b1765 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/include/ddk/ntddk.h @@ -37,10 +37,10 @@ extern "C" #include #include #include +#include #include #include #include -#include #include #include diff --git a/reactos/include/ddk/obfuncs.h b/reactos/include/ddk/obfuncs.h index 6aa30d52510..2544a340b8e 100644 --- a/reactos/include/ddk/obfuncs.h +++ b/reactos/include/ddk/obfuncs.h @@ -44,4 +44,4 @@ NTSTATUS ObReferenceObjectByPointer(PVOID Object, KPROCESSOR_MODE AccessMode); NTSTATUS ObOpenObjectByName(POBJECT_ATTRIBUTES ObjectAttributes, - PVOID* Object); + PVOID* Object, PWSTR* UnparsedSection); diff --git a/reactos/include/ddk/obtypes.h b/reactos/include/ddk/obtypes.h index 23500fcc970..b7b0bc4da1e 100644 --- a/reactos/include/ddk/obtypes.h +++ b/reactos/include/ddk/obtypes.h @@ -9,6 +9,7 @@ typedef struct _OBJECT_HANDLE_INFORMATION { struct _OBJECT; + typedef struct _OBJECT_TYPE { /* @@ -132,15 +133,11 @@ typedef struct _OBJECT } OBJECT_HEADER, *POBJECT_HEADER; -/* - * PURPOSE: Defines an object - */ -typedef struct _OBJECT_ATTRIBUTES -{ - ULONG Length; - HANDLE RootDirectory; - PUNICODE_STRING ObjectName; - ULONG Attributes; - PVOID SecurityDescriptor; - PVOID SecurityQualityOfService; +typedef struct _OBJECT_ATTRIBUTES { + ULONG Length; + HANDLE RootDirectory; + PUNICODE_STRING ObjectName; + ULONG Attributes; + SECURITY_DESCRIPTOR *SecurityDescriptor; + SECURITY_QUALITY_OF_SERVICE *SecurityQualityOfService; } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; diff --git a/reactos/include/ddk/setypes.h b/reactos/include/ddk/setypes.h index 299ded32b61..0897180f3a3 100644 --- a/reactos/include/ddk/setypes.h +++ b/reactos/include/ddk/setypes.h @@ -8,7 +8,11 @@ * 29/08/98: ACCESS_TOKEN definition from Boudewijn Dekker */ +#ifndef __INCLUDE_DDK_SETYPES_H +#define __INCLUDE_DDK_SETYPES_H + typedef ULONG ACCESS_MODE, *PACCESS_MODE; +typedef SECURITY_QUALITY_OF_SERVICE* PSECURITY_QUALITY_OF_SERVICE; typedef struct _SECURITY_SUBJECT_CONTEXT { @@ -39,3 +43,5 @@ typedef struct _ACCESS_TOKEN { PVOID AuditData; UCHAR VariablePart[0]; } ACCESS_TOKEN, *PACCESS_TOKEN; + +#endif diff --git a/reactos/include/ddk/status.h b/reactos/include/ddk/status.h index 6b6d3496acf..dd67ee614c3 100644 --- a/reactos/include/ddk/status.h +++ b/reactos/include/ddk/status.h @@ -153,7 +153,12 @@ enum // STATUS_WRONG_VOLUME, STATUS_FS_DRIVER_REQUIRED, STATUS_NOT_SUPPORTED = 9999, - STATUS_DISK_OPERATION_FAILED + STATUS_DISK_OPERATION_FAILED, + + /* + * Reactos codes + */ + STATUS_FS_QUERY_REQUIRED, }; #endif /* __INCLUDE_DDK_STATUS_H */ diff --git a/reactos/include/ddk/zw.h b/reactos/include/ddk/zw.h index 9f96d90d49f..8e345c4c766 100644 --- a/reactos/include/ddk/zw.h +++ b/reactos/include/ddk/zw.h @@ -16,6 +16,13 @@ #include +typedef struct _OBJDIR_INFORMATION { + UNICODE_STRING ObjectName; + UNICODE_STRING ObjectTypeName; // Directory, Device ... + UCHAR Data[0]; +} OBJDIR_INFORMATION, *POBJDIR_INFORMATION; + + /* * FUNCTION: Closes an object handle * ARGUMENTS: @@ -177,6 +184,14 @@ NTSTATUS ZwOpenKey(PHANDLE KeyHandle, ACCESS_MASK DesiredAccess, NTSTATUS ZwOpenSection(PHANDLE KeyHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes); +NTSTATUS ZwQueryDirectoryObject(IN HANDLE DirObjHandle, + OUT POBJDIR_INFORMATION DirObjInformation, + IN ULONG BufferLength, + IN BOOLEAN GetNextIndex, + IN BOOLEAN IgnoreInputIndex, + IN OUT PULONG ObjectIndex, + OUT PULONG DataWritten OPTIONAL); + /* * FUNCTION: Returns information about an open file * ARGUMENTS: @@ -196,29 +211,20 @@ NTSTATUS ZwQueryInformationFile(HANDLE FileHandle, +NTSTATUS ZwReadFile(HANDLE FileHandle, + HANDLE EventHandle, + PIO_APC_ROUTINE ApcRoutine, + PVOID ApcContext, + PIO_STATUS_BLOCK IoStatusBlock, + PVOID Buffer, + ULONG Length, + PLARGE_INTEGER ByteOffset, + PULONG Key); + + -#if KERNEL_SUPPORTS_OBJECT_ATTRIBUTES_CORRECTLY -typedef struct _OBJECT_ATTRIBUTES { - ULONG Length; - HANDLE RootDirectory; - PUNICODE_STRING ObjectName; - ULONG Attributes; - SECURITY_DESCRIPTOR *SecurityDescriptor; - SECURITY_QUALITY_OF_SERVICE *SecurityQualityOfService; -} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; -#endif - -/* -#if IOTYPES_DIDNT_DECLARE_THIS -typedef struct _IO_STATUS_BLOCK { - NTSTATUS Status; - ULONG Information; -} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; -#endif -*/ - #define NtCurrentProcess() ( (HANDLE) 0xFFFFFFFF ) #define NtCurrentThread() ( (HANDLE) 0xFFFFFFFE ) @@ -879,12 +885,6 @@ typedef union _FILE_SEGMENT_ELEMENT { // directory information -typedef struct _OBJDIR_INFORMATION { - UNICODE_STRING ObjectName; - UNICODE_STRING ObjectTypeName; // Directory, Device ... - UCHAR Data[0]; -} OBJDIR_INFORMATION, *POBJDIR_INFORMATION; - typedef struct _FILE_DIRECTORY_INFORMATION { ULONG NextEntryOffset; diff --git a/reactos/include/internal/debug.h b/reactos/include/internal/debug.h index f770eb2f7fe..f52773283ff 100644 --- a/reactos/include/internal/debug.h +++ b/reactos/include/internal/debug.h @@ -16,6 +16,13 @@ #ifndef __INTERNAL_DEBUG #define __INTERNAL_DEBUG + +#ifndef NDEBUG +#define DPRINT1(x) DbgPrint(x) +#else +#define DPRINT1(x) +#endif + #define UNIMPLEMENTED do {DbgPrint("%s at %s:%d is umimplemented, have a nice day\n",__FUNCTION__,__FILE__,__LINE__); for(;;); } while(0); #ifndef NDEBUG diff --git a/reactos/include/internal/mm.h b/reactos/include/internal/mm.h index 189ba82b8e9..2398fcac9cd 100644 --- a/reactos/include/internal/mm.h +++ b/reactos/include/internal/mm.h @@ -26,6 +26,8 @@ enum typedef struct { + CSHORT Type; + CSHORT Size; FILE_OBJECT* File; } SECTION_OBJECT; @@ -36,10 +38,15 @@ typedef struct ULONG Length; ULONG Attributes; LIST_ENTRY Entry; + ULONG LockCount; union { - SECTION_OBJECT* Section; - } d; + struct + { + SECTION_OBJECT* Section; + ULONG ViewOffset; + } SectionData; + } Data; } MEMORY_AREA; @@ -85,16 +92,6 @@ asmlinkage unsigned int get_free_page(void); */ asmlinkage void free_page(unsigned int physical_base, unsigned int nr); -/* - * FUNCTION: Returns the physical address mapped by a given virtual address - * ARGUMENTS: - * vaddr = virtual address to query - * RETURNS: The physical address if present in memory - * Zero if paged out or invalid - * NOTE: This doesn't do any synchronization - */ -unsigned int get_page_physical_address(unsigned int vaddr); - void mark_page_not_writable(unsigned int vaddr); void VirtualInit(boot_param* bp); diff --git a/reactos/include/internal/module.h b/reactos/include/internal/module.h index c76e0d0ecae..c2b98be5bd1 100644 --- a/reactos/include/internal/module.h +++ b/reactos/include/internal/module.h @@ -8,7 +8,8 @@ typedef struct /* * */ -{ +{ + unsigned int nsyms; unsigned int text_base; unsigned int data_base; unsigned int bss_base; diff --git a/reactos/include/internal/version.h b/reactos/include/internal/version.h index f219e8bce63..56a3d84d253 100644 --- a/reactos/include/internal/version.h +++ b/reactos/include/internal/version.h @@ -9,9 +9,9 @@ #ifndef __VERSION_H #define __VERSION_H -#define KERNEL_VERSION "0.0.10" +#define KERNEL_VERSION "0.0.11" #define KERNEL_MAJOR_VERSION 0 #define KERNEL_MINOR_VERSION 0 -#define KERNEL_PATCH_LEVEL 10 +#define KERNEL_PATCH_LEVEL 11 #endif diff --git a/reactos/ntoskrnl/exports.lst b/reactos/ntoskrnl/exports.lst index ca14ad90464..5208b4a06d4 100644 --- a/reactos/ntoskrnl/exports.lst +++ b/reactos/ntoskrnl/exports.lst @@ -158,6 +158,7 @@ IoRaiseHardError IoRaiseInformationalHardError IoReadPartitionTable IoRegisterDriverReinitialization +IoRegisterFileSystem IoRegisterShutdownNotification IoReleaseCancelSpinLock IoRemoveShareAccess @@ -375,3 +376,4 @@ ZwSetValueKey ZwUnmapViewOfSection ZwWriteFile sprintf +wcschr diff --git a/reactos/ntoskrnl/hal/x86/exp.c b/reactos/ntoskrnl/hal/x86/exp.c index 10dcfae1515..68c3bc995c1 100644 --- a/reactos/ntoskrnl/hal/x86/exp.c +++ b/reactos/ntoskrnl/hal/x86/exp.c @@ -137,7 +137,7 @@ asmlinkage void exception_handler(unsigned int edi, */ printk("Exception: %d(%x)\n",type,error_code&0xffff); printk("CS:EIP %x:%x\n",cs&0xffff,eip); - for(;;); +// for(;;); printk("EAX: %.8x EBX: %.8x ECX: %.8x\n",eax,ebx,ecx); printk("EDX: %.8x EBP: %.8x ESI: %.8x\n",edx,ebp,esi); printk("EDI: %.8x EFLAGS: %.8x ",edi,eflags); diff --git a/reactos/ntoskrnl/hal/x86/printk.c b/reactos/ntoskrnl/hal/x86/printk.c index f5be4dec169..e2feb90d982 100644 --- a/reactos/ntoskrnl/hal/x86/printk.c +++ b/reactos/ntoskrnl/hal/x86/printk.c @@ -20,6 +20,8 @@ /* GLOBALS ******************************************************************/ +#define BOCHS_LOGGER_PORT (0x3ed) + /* * PURPOSE: Current cursor position */ @@ -120,7 +122,9 @@ static void putchar(char c) char* address; int offset; int i; - + + outb_p(BOCHS_LOGGER_PORT,c); + switch(c) { case '\n': @@ -268,7 +272,7 @@ ULONG DbgPrint(PCH Format, ...) : "m" (eflags)); } -void InitConsole(boot_param* bp) +void HalInitConsole(boot_param* bp) /* * FUNCTION: Initalize the console * ARGUMENTS: diff --git a/reactos/ntoskrnl/hal/x86/thread.c b/reactos/ntoskrnl/hal/x86/thread.c index 5f7bd4e3db6..f918120021a 100644 --- a/reactos/ntoskrnl/hal/x86/thread.c +++ b/reactos/ntoskrnl/hal/x86/thread.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/reactos/ntoskrnl/io/create.c b/reactos/ntoskrnl/io/create.c index ef3a8ae848a..9a2ec501c72 100644 --- a/reactos/ntoskrnl/io/create.c +++ b/reactos/ntoskrnl/io/create.c @@ -12,9 +12,10 @@ #include #include -#include -#include +#include +#include #include +#include #define NDEBUG #include @@ -48,7 +49,7 @@ NTSTATUS ZwCreateFile(PHANDLE FileHandle, * FileAttributes = Attributes to create the file with * ShareAccess = Type of shared access the caller would like to the file * CreateDisposition = Specifies what to do, depending on whether the - * file already existings + * file already exists * CreateOptions = Options for creating a new file * EaBuffer = Undocumented * EaLength = Undocumented @@ -85,47 +86,112 @@ NTSTATUS ZwOpenFile(PHANDLE FileHandle, PDEVICE_OBJECT DeviceObject; PFILE_OBJECT FileObject; PIO_STACK_LOCATION StackLoc; + PWSTR Remainder; + + DPRINT("ZwOpenFile(FileHandle %x, ObjectAttributes %x, " + "ObjectAttributes->ObjectName->Buffer %w)\n",FileHandle, + ObjectAttributes,ObjectAttributes->ObjectName->Buffer); assert_irql(PASSIVE_LEVEL); *FileHandle=0; - - Status = ObOpenObjectByName(ObjectAttributes,&Object); - DPRINT("Object %x Status %x\n",Object,Status); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - DeviceObject = (PDEVICE_OBJECT)Object; FileObject = ObGenericCreateObject(FileHandle,0,NULL,OBJTYP_FILE); - DPRINT("FileObject %x DeviceObject %x\n",FileObject,DeviceObject); memset(FileObject,0,sizeof(FILE_OBJECT)); + + Status = ObOpenObjectByName(ObjectAttributes,&Object,&Remainder); + + if (Status != STATUS_SUCCESS && Status != STATUS_FS_QUERY_REQUIRED) + { + DPRINT("%s() = Failed to find object\n",__FUNCTION__); + ObDeleteHandle(*FileHandle); + *FileHandle=0; + ExFreePool(FileObject); + return(STATUS_UNSUCCESSFUL); + } + + + DeviceObject = (PDEVICE_OBJECT)Object; + DeviceObject = IoGetAttachedDevice(DeviceObject); + DPRINT("DeviceObject %x\n",DeviceObject); + + if (Status == STATUS_SUCCESS) + { + CHECKPOINT; + FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN; + FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool, + ObjectAttributes->Length); + RtlCopyUnicodeString(&(FileObject->FileName), + ObjectAttributes->ObjectName); + } + else + { + CHECKPOINT; + if (DeviceObject->DeviceType != FILE_DEVICE_FILE_SYSTEM && + DeviceObject->DeviceType != FILE_DEVICE_DISK) + { + ObDeleteHandle(*FileHandle); + *FileHandle=0; + ExFreePool(FileObject); + return(STATUS_UNSUCCESSFUL); + } + if (!(DeviceObject->Vpb->Flags & VPB_MOUNTED)) + { + Status = IoTryToMountStorageDevice(DeviceObject); + if (Status!=STATUS_SUCCESS) + { + ObDeleteHandle(*FileHandle); + *FileHandle=0; + ExFreePool(FileObject); + return(Status); + } + DeviceObject = IoGetAttachedDevice(DeviceObject); + } + DPRINT("Remainder %w\n",Remainder); + FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool, + wstrlen(Remainder)); + RtlInitUnicodeString(&(FileObject->FileName),Remainder); + DPRINT("FileObject->FileName.Buffer %x %w\n", + FileObject->FileName.Buffer,FileObject->FileName.Buffer); + } + CHECKPOINT; + FileObject->DeviceObject=DeviceObject; - FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN; + FileObject->Vpb=DeviceObject->Vpb; KeInitializeEvent(&Event,NotificationEvent,FALSE); Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE); if (Irp==NULL) { + ObDeleteHandle(*FileHandle); + *FileHandle=0; + ExFreePool(FileObject); return(STATUS_UNSUCCESSFUL); } StackLoc = IoGetNextIrpStackLocation(Irp); - DPRINT("StackLoc %x\n",StackLoc); StackLoc->MajorFunction = IRP_MJ_CREATE; StackLoc->MinorFunction = 0; StackLoc->Flags = 0; StackLoc->Control = 0; StackLoc->DeviceObject = DeviceObject; StackLoc->FileObject=FileObject; - DPRINT("DeviceObject %x\n",DeviceObject); - DPRINT("DeviceObject->DriverObject %x\n",DeviceObject->DriverObject); - IoCallDriver(DeviceObject,Irp); + Status = IoCallDriver(DeviceObject,Irp); + if (Status==STATUS_PENDING) + { + KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL); + Status = IoStatusBlock->Status; + } - return(STATUS_SUCCESS); + if (Status!=STATUS_SUCCESS) + { + ObDeleteHandle(*FileHandle); + *FileHandle=0; + ExFreePool(FileObject); + } + + return(Status); } diff --git a/reactos/ntoskrnl/io/device.c b/reactos/ntoskrnl/io/device.c index 6af10578162..822a85af7e9 100644 --- a/reactos/ntoskrnl/io/device.c +++ b/reactos/ntoskrnl/io/device.c @@ -12,8 +12,8 @@ #include -#include -#include +#include +#include #include #define NDEBUG @@ -60,10 +60,31 @@ VOID IoDetachDevice(PDEVICE_OBJECT TargetDevice) UNIMPLEMENTED; } +PDEVICE_OBJECT IoGetAttachedDevice(PDEVICE_OBJECT DeviceObject) +{ + PDEVICE_OBJECT Current = DeviceObject; + + DPRINT("IoGetAttachDevice(DeviceObject %x)\n",DeviceObject); + + while (Current->AttachedDevice!=NULL) + { + Current = Current->AttachedDevice; + DPRINT("Current %x\n",Current); + } + return(Current); +} + PDEVICE_OBJECT IoAttachDeviceToDeviceStack(PDEVICE_OBJECT SourceDevice, PDEVICE_OBJECT TargetDevice) { - UNIMPLEMENTED; + PDEVICE_OBJECT AttachedDevice = IoGetAttachedDevice(TargetDevice); + + DPRINT("IoAttachDeviceToDeviceStack(SourceDevice %x, TargetDevice %x)\n", + SourceDevice,TargetDevice); + + AttachedDevice->AttachedDevice = SourceDevice; + SourceDevice->StackSize = AttachedDevice->StackSize + 1; + return(AttachedDevice); } VOID IoRegisterDriverReinitialization(PDRIVER_OBJECT DriverObject, @@ -153,11 +174,25 @@ NTSTATUS IoCreateDevice(PDRIVER_OBJECT DriverObject, OBJECT_ATTRIBUTES dev_attr; HANDLE devh; - DPRINT("IoCreateDevice(DriverObject %x, DeviceName %w)\n",DriverObject, - DeviceName->Buffer); - - InitializeObjectAttributes(&dev_attr,DeviceName,0,NULL,NULL); - dev = ObGenericCreateObject(&devh,0,&dev_attr,OBJTYP_DEVICE); + if (DeviceName!=NULL) + { + DPRINT("IoCreateDevice(DriverObject %x, DeviceName %w)\n",DriverObject, + DeviceName->Buffer); + } + else + { + DPRINT("IoCreateDevice(DriverObject %x)\n",DriverObject); + } + + if (DeviceName!=NULL) + { + InitializeObjectAttributes(&dev_attr,DeviceName,0,NULL,NULL); + dev = ObGenericCreateObject(&devh,0,&dev_attr,OBJTYP_DEVICE); + } + else + { + dev = ObGenericCreateObject(&devh,0,NULL,OBJTYP_DEVICE); + } *DeviceObject=NULL; @@ -191,11 +226,17 @@ NTSTATUS IoCreateDevice(PDRIVER_OBJECT DriverObject, return(STATUS_INSUFFICIENT_RESOURCES); } + dev->AttachedDevice=NULL; dev->DeviceType=DeviceType; dev->StackSize=1; dev->AlignmentRequirement=1; KeInitializeDeviceQueue(&dev->DeviceQueue); + if (dev->DeviceType==FILE_DEVICE_DISK) + { + IoAttachVpb(dev); + } + *DeviceObject=dev; DPRINT("dev->DriverObject %x\n",dev->DriverObject); diff --git a/reactos/ntoskrnl/io/fs.c b/reactos/ntoskrnl/io/fs.c index 32ccec730cb..8563275909a 100644 --- a/reactos/ntoskrnl/io/fs.c +++ b/reactos/ntoskrnl/io/fs.c @@ -11,7 +11,9 @@ /* INCLUDES *****************************************************************/ #include +#include +#define NDEBUG #include /* TYPES *******************************************************************/ @@ -35,9 +37,30 @@ VOID IoInitFileSystemImplementation(VOID) KeInitializeSpinLock(&FileSystemListLock); } -NTSTATUS IoAskFileSystemToMountDevice(PDEVICE_OBJECT DeviceObject) +NTSTATUS IoAskFileSystemToMountDevice(PDEVICE_OBJECT DeviceObject, + PDEVICE_OBJECT DeviceToMount) { - UNIMPLEMENTED; + PIRP Irp; + KEVENT Event; + IO_STATUS_BLOCK IoStatusBlock; + NTSTATUS Status; + + DPRINT("IoAskFileSystemToMountDevice(DeviceObject %x, DeviceToMount %x)\n", + DeviceObject,DeviceToMount); + + KeInitializeEvent(&Event,NotificationEvent,FALSE); + Irp = IoBuildFilesystemControlRequest(IRP_MN_MOUNT_VOLUME, + DeviceObject, + &Event, + &IoStatusBlock, + DeviceToMount); + Status = IoCallDriver(DeviceObject,Irp); + if (Status==STATUS_PENDING) + { + KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL); + Status = IoStatusBlock.Status; + } + return(Status); } NTSTATUS IoAskFileSystemToLoad(PDEVICE_OBJECT DeviceObject) @@ -58,12 +81,15 @@ NTSTATUS IoTryToMountStorageDevice(PDEVICE_OBJECT DeviceObject) FILE_SYSTEM_OBJECT* current; NTSTATUS Status; + DPRINT("IoTryToMountStorageDevice(DeviceObject %x)\n",DeviceObject); + KeAcquireSpinLock(&FileSystemListLock,&oldlvl); current_entry = FileSystemListHead.Flink; - while (current_entry!=NULL) + while (current_entry!=(&FileSystemListHead)) { current = CONTAINING_RECORD(current_entry,FILE_SYSTEM_OBJECT,Entry); - Status = IoAskFileSystemToMountDevice(DeviceObject); + Status = IoAskFileSystemToMountDevice(current->DeviceObject, + DeviceObject); switch (Status) { case STATUS_FS_DRIVER_REQUIRED: @@ -90,6 +116,8 @@ VOID IoRegisterFileSystem(PDEVICE_OBJECT DeviceObject) { FILE_SYSTEM_OBJECT* fs; + DPRINT("IoRegisterFileSystem(DeviceObject %x)\n",DeviceObject); + fs=ExAllocatePool(NonPagedPool,sizeof(FILE_SYSTEM_OBJECT)); assert(fs!=NULL); @@ -103,10 +131,12 @@ VOID IoUnregisterFileSystem(PDEVICE_OBJECT DeviceObject) KIRQL oldlvl; PLIST_ENTRY current_entry; FILE_SYSTEM_OBJECT* current; + + DPRINT("IoUnregisterFileSystem(DeviceObject %x)\n",DeviceObject); KeAcquireSpinLock(&FileSystemListLock,&oldlvl); current_entry = FileSystemListHead.Flink; - while (current_entry!=NULL) + while (current_entry!=(&FileSystemListHead)) { current = CONTAINING_RECORD(current_entry,FILE_SYSTEM_OBJECT,Entry); if (current->DeviceObject == DeviceObject) diff --git a/reactos/ntoskrnl/io/iomgr.c b/reactos/ntoskrnl/io/iomgr.c index 46bca6fffbb..dbd86228df3 100644 --- a/reactos/ntoskrnl/io/iomgr.c +++ b/reactos/ntoskrnl/io/iomgr.c @@ -12,7 +12,7 @@ #include #include -#include +#include #define NDEBUG #include @@ -66,28 +66,28 @@ VOID IoInit(VOID) /* * Register iomgr types */ - CHECKPOINT; RtlInitAnsiString(&astring,"Device"); - CHECKPOINT; RtlAnsiStringToUnicodeString(&DeviceObjectType.TypeName,&astring,TRUE); - CHECKPOINT; ObRegisterType(OBJTYP_DEVICE,&DeviceObjectType); - CHECKPOINT; + RtlInitAnsiString(&astring,"File"); RtlAnsiStringToUnicodeString(&FileObjectType.TypeName,&astring,TRUE); ObRegisterType(OBJTYP_FILE,&FileObjectType); - CHECKPOINT; + /* * Create the device directory */ RtlInitAnsiString(&astring,"\\Device"); - CHECKPOINT; RtlAnsiStringToUnicodeString(&string,&astring,TRUE); - CHECKPOINT; InitializeObjectAttributes(&attr,&string,0,NULL,NULL); - CHECKPOINT; ZwCreateDirectoryObject(&handle,0,&attr); - CHECKPOINT; + + RtlInitAnsiString(&astring,"\\??"); + RtlAnsiStringToUnicodeString(&string,&astring,TRUE); + InitializeObjectAttributes(&attr,&string,0,NULL,NULL); + ZwCreateDirectoryObject(&handle,0,&attr); + IoInitCancelHandling(); IoInitSymbolicLinkImplementation(); + IoInitFileSystemImplementation(); } diff --git a/reactos/ntoskrnl/io/symlink.c b/reactos/ntoskrnl/io/symlink.c index 7c94df45116..077d37322d0 100644 --- a/reactos/ntoskrnl/io/symlink.c +++ b/reactos/ntoskrnl/io/symlink.c @@ -11,22 +11,27 @@ /* INCLUDES *****************************************************************/ #include +#include +#define NDEBUG #include /* GLOBALS ******************************************************************/ typedef struct { - PVOID Target; -} SYMBOLIC_LINK_OBJECT; + CSHORT Type; + CSHORT Size; + UNICODE_STRING TargetName; + OBJECT_ATTRIBUTES Target; +} SYMLNK_OBJECT, *PSYMLNK_OBJECT; OBJECT_TYPE SymlinkObjectType = {{NULL,0,0}, 0, 0, ULONG_MAX, ULONG_MAX, - sizeof(SYMBOLIC_LINK_OBJECT), + sizeof(SYMLNK_OBJECT), 0, NULL, NULL, @@ -40,9 +45,65 @@ OBJECT_TYPE SymlinkObjectType = {{NULL,0,0}, /* FUNCTIONS *****************************************************************/ +NTSTATUS ZwOpenSymbolicLinkObject(OUT PHANDLE LinkHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes) +{ + NTSTATUS Status; + PVOID Object; + PWSTR Ignored; + + Status = ObOpenObjectByName(ObjectAttributes,&Object,&Ignored); + if (!NT_SUCCESS(Status)) + { + return(Status); + } + *LinkHandle = ObAddHandle(Object); + return(STATUS_SUCCESS); +} + +NTSTATUS ZwQuerySymbolicLinkObject(IN HANDLE LinkHandle, + IN OUT PUNICODE_STRING LinkTarget, + OUT PULONG ReturnedLength OPTIONAL) +{ + COMMON_BODY_HEADER* hdr = ObGetObjectByHandle(LinkHandle); + PSYMLNK_OBJECT SymlinkObject = (PSYMLNK_OBJECT)hdr; + + if (hdr==NULL) + { + return(STATUS_INVALID_HANDLE); + } + + RtlCopyUnicodeString(LinkTarget,SymlinkObject->Target.ObjectName); + if (ReturnedLength!=NULL) + { + *ReturnedLength=SymlinkObject->Target.Length; + } + return(STATUS_SUCCESS); +} + + +POBJECT IoOpenSymlink(POBJECT _Symlink) +{ + PVOID Result; + PSYMLNK_OBJECT Symlink = (PSYMLNK_OBJECT)_Symlink; + PWSTR Ignored; + + DPRINT("IoOpenSymlink(_Symlink %x)\n",Symlink); + + DPRINT("Target %w\n",Symlink->Target.ObjectName->Buffer); + + ObOpenObjectByName(&(Symlink->Target),&Result,&Ignored); + return(Result); +} + VOID IoInitSymbolicLinkImplementation(VOID) { + ANSI_STRING astring; + RtlInitAnsiString(&astring,"Symbolic Link"); + RtlAnsiStringToUnicodeString(&SymlinkObjectType.TypeName,&astring,TRUE); + ObRegisterType(OBJTYP_SYMLNK,&SymlinkObjectType); } NTSTATUS IoCreateUnprotectedSymbolicLink(PUNICODE_STRING SymbolicLinkName, @@ -54,7 +115,31 @@ NTSTATUS IoCreateUnprotectedSymbolicLink(PUNICODE_STRING SymbolicLinkName, NTSTATUS IoCreateSymbolicLink(PUNICODE_STRING SymbolicLinkName, PUNICODE_STRING DeviceName) { - UNIMPLEMENTED; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE SymbolicLinkHandle; + PSYMLNK_OBJECT SymbolicLink; + PUNICODE_STRING TargetName; + + DPRINT("IoCreateSymbolicLink(SymbolicLinkName %w, DeviceName %w)\n", + SymbolicLinkName->Buffer,DeviceName->Buffer); + + InitializeObjectAttributes(&ObjectAttributes,SymbolicLinkName,0,NULL,NULL); + SymbolicLink = ObGenericCreateObject(&SymbolicLinkHandle,0, + &ObjectAttributes,OBJTYP_SYMLNK); + if (SymbolicLink == NULL) + { + return(STATUS_UNSUCCESSFUL); + } + SymbolicLink->TargetName.Buffer = ExAllocatePool(NonPagedPool, + ((wstrlen(DeviceName->Buffer)+1)*2)); + SymbolicLink->TargetName.MaximumLength = wstrlen(DeviceName->Buffer); + SymbolicLink->TargetName.Length = 0; + RtlCopyUnicodeString(&(SymbolicLink->TargetName),DeviceName); + DPRINT("DeviceName %w\n",SymbolicLink->TargetName.Buffer); + InitializeObjectAttributes(&(SymbolicLink->Target), + &(SymbolicLink->TargetName),0,NULL,NULL); + DPRINT("%s() = STATUS_SUCCESS\n",__FUNCTION__); + return(STATUS_SUCCESS); } NTSTATUS IoDeleteSymbolicLink(PUNICODE_STRING DeviceName) diff --git a/reactos/ntoskrnl/ke/exports.c b/reactos/ntoskrnl/ke/exports.c index d5645a8213b..995affd5fb5 100644 --- a/reactos/ntoskrnl/ke/exports.c +++ b/reactos/ntoskrnl/ke/exports.c @@ -159,6 +159,7 @@ void IoRaiseHardError(void); void IoRaiseInformationalHardError(void); void IoReadPartitionTable(void); void IoRegisterDriverReinitialization(void); +void IoRegisterFileSystem(void); void IoRegisterShutdownNotification(void); void IoReleaseCancelSpinLock(void); void IoRemoveShareAccess(void); @@ -376,6 +377,7 @@ void ZwSetValueKey(void); void ZwUnmapViewOfSection(void); void ZwWriteFile(void); void sprintf(void); +void wcschr(void); #ifdef __cplusplus } #endif @@ -531,6 +533,7 @@ export symbol_table[]={ {"_IoRaiseInformationalHardError",(unsigned int)IoRaiseInformationalHardError}, {"_IoReadPartitionTable",(unsigned int)IoReadPartitionTable}, {"_IoRegisterDriverReinitialization",(unsigned int)IoRegisterDriverReinitialization}, +{"_IoRegisterFileSystem",(unsigned int)IoRegisterFileSystem}, {"_IoRegisterShutdownNotification",(unsigned int)IoRegisterShutdownNotification}, {"_IoReleaseCancelSpinLock",(unsigned int)IoReleaseCancelSpinLock}, {"_IoRemoveShareAccess",(unsigned int)IoRemoveShareAccess}, @@ -748,5 +751,6 @@ export symbol_table[]={ {"_ZwUnmapViewOfSection",(unsigned int)ZwUnmapViewOfSection}, {"_ZwWriteFile",(unsigned int)ZwWriteFile}, {"_sprintf",(unsigned int)sprintf}, +{"_wcschr",(unsigned int)wcschr}, {NULL,NULL}, }; diff --git a/reactos/ntoskrnl/mm/mdl.c b/reactos/ntoskrnl/mm/mdl.c index 68237bcc2dd..c920ec62fe9 100644 --- a/reactos/ntoskrnl/mm/mdl.c +++ b/reactos/ntoskrnl/mm/mdl.c @@ -44,7 +44,7 @@ PVOID MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) * range described by the MDL */ { - PVOID base; + PVOID base = NULL; unsigned int i; ULONG* mdl_pages=NULL; MEMORY_AREA* Result; @@ -59,6 +59,7 @@ PVOID MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode) Mdl->ByteCount, 0, &Result); + CHECKPOINT; mdl_pages = (ULONG *)(Mdl + 1); for (i=0; i<(PAGE_ROUND_UP(Mdl->ByteCount)/PAGESIZE); i++) { diff --git a/reactos/ntoskrnl/mm/special.c b/reactos/ntoskrnl/mm/special.c index 55cdfdcbb6c..82e2bfd86ac 100644 --- a/reactos/ntoskrnl/mm/special.c +++ b/reactos/ntoskrnl/mm/special.c @@ -39,7 +39,7 @@ PVOID MmAllocateSection(ULONG Length) { return(NULL); } - CHECKPOINT; + DPRINT("Result %x\n",Result); Attributes = PA_WRITE | PA_READ | PA_EXECUTE | PA_SYSTEM; for (i=0;i<=(Length/PAGESIZE);i++) { diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index ae8fa0e3789..a1d4fa95833 100644 --- a/reactos/ntoskrnl/mm/virtual.c +++ b/reactos/ntoskrnl/mm/virtual.c @@ -59,12 +59,12 @@ void VirtualInit(boot_param* bp) * Setup the system area descriptor list */ BaseAddress = KERNEL_BASE; - Length = ((ULONG)&etext) - KERNEL_BASE; + Length = PAGE_ROUND_UP(((ULONG)&etext)) - KERNEL_BASE; ParamLength = ParamLength - Length; MmCreateMemoryArea(KernelMode,MEMORY_AREA_SYSTEM,&BaseAddress, Length,0,&kernel_text_desc); - Length = ((ULONG)&end) - ((ULONG)&etext); + Length = PAGE_ROUND_UP(((ULONG)&end)) - PAGE_ROUND_UP(((ULONG)&etext)); ParamLength = ParamLength - Length; DPRINT("Length %x\n",Length); BaseAddress = PAGE_ROUND_UP(((ULONG)&etext)); @@ -113,18 +113,26 @@ asmlinkage int page_fault_handler(unsigned int edi, { KPROCESSOR_MODE FaultMode; MEMORY_AREA* MemoryArea; + KIRQL oldlvl; + ULONG stat; /* * Get the address for the page fault */ unsigned int cr2; __asm__("movl %%cr2,%0\n\t" : "=d" (cr2)); - DPRINT("Page fault at address %x with eip %x\n",cr2,eip); - for(;;); + DbgPrint("Page fault at address %x with eip %x\n",cr2,eip); cr2 = PAGE_ROUND_DOWN(cr2); - assert_irql(DISPATCH_LEVEL); + if (KeGetCurrentIrql()!=PASSIVE_LEVEL) + { + DbgPrint("Recursive page fault detected\n"); + KeBugCheck(0); + for(;;); + } + + KeRaiseIrql(DISPATCH_LEVEL,&oldlvl); /* * Find the memory area for the faulting address @@ -156,12 +164,21 @@ asmlinkage int page_fault_handler(unsigned int edi, switch (MemoryArea->Type) { case MEMORY_AREA_SYSTEM: - return(0); + stat = 0; + break; case MEMORY_AREA_SECTION_VIEW: - return(MmSectionHandleFault(MemoryArea,cr2)); + stat = MmSectionHandleFault(MemoryArea,cr2); + + default: + stat = 0; + break; } - return(0); + if (stat) + { + KeLowerIrql(oldlvl); + } + return(stat); } diff --git a/reactos/ntoskrnl/ob/handle.c b/reactos/ntoskrnl/ob/handle.c index ffd4950e0fa..53c222a7466 100644 --- a/reactos/ntoskrnl/ob/handle.c +++ b/reactos/ntoskrnl/ob/handle.c @@ -12,7 +12,7 @@ #include #include -#include +#include #include #define NDEBUG @@ -26,7 +26,7 @@ typedef struct { PVOID obj; -} HANDLE_REP; +} HANDLE_REP, *PHANDLE_REP; #define HANDLE_BLOCK_ENTRIES ((PAGESIZE-sizeof(LIST_ENTRY))/sizeof(HANDLE_REP)) @@ -89,10 +89,33 @@ VOID ObjInitializeHandleTable(HANDLE parent) * parent = Parent process (or NULL if this is the first process) */ { + DPRINT("ObjInitializeHandleTable(parent %x)\n",parent); + InitializeListHead(&handle_list_head); KeInitializeSpinLock(&handle_list_lock); } +static PHANDLE_REP ObTranslateHandle(HANDLE* h) +{ + PLIST_ENTRY current = handle_list_head.Flink; + unsigned int handle = ((unsigned int)h) - 1; + unsigned int count=handle/HANDLE_BLOCK_ENTRIES; + HANDLE_BLOCK* blk = NULL; + unsigned int i; + + for (i=0;iFlink; + if (current==(&handle_list_head)) + { + return(NULL); + } + } + + blk = (HANDLE_BLOCK *)current; + return(&(blk->handles[handle%HANDLE_BLOCK_ENTRIES])); +} + PVOID ObGetObjectByHandle(HANDLE h) /* * FUNCTION: Translate a handle to the corresponding object @@ -101,23 +124,20 @@ PVOID ObGetObjectByHandle(HANDLE h) * RETURNS: The object */ { - LIST_ENTRY* current = handle_list_head.Flink; - unsigned int handle = ((unsigned int)h) - 1; - unsigned int count=handle/HANDLE_BLOCK_ENTRIES; - HANDLE_BLOCK* blk = NULL; - unsigned int i; + DPRINT("ObGetObjectByHandle(h %x)\n",h); - for (i=0;iFlink; - if (current==NULL) - { - return(NULL); - } + return(NULL); } - blk = (HANDLE_BLOCK *)current; - return(blk->handles[handle%HANDLE_BLOCK_ENTRIES].obj); + return(ObTranslateHandle(h)->obj); +} + +VOID ObDeleteHandle(HANDLE Handle) +{ + PHANDLE_REP Rep = ObTranslateHandle(Handle); + Rep->obj=NULL; } HANDLE ObAddHandle(PVOID obj) @@ -134,13 +154,13 @@ HANDLE ObAddHandle(PVOID obj) unsigned int i; HANDLE_BLOCK* new_blk = NULL; - DPRINT("ObAddHandle(obj %)\n",obj); + DPRINT("ObAddHandle(obj %x)\n",obj); /* * Scan through the currently allocated handle blocks looking for a free * slot */ - while (current!=NULL) + while (current!=(&handle_list_head)) { HANDLE_BLOCK* blk = (HANDLE_BLOCK *)current; diff --git a/reactos/ntoskrnl/ob/namespc.c b/reactos/ntoskrnl/ob/namespc.c index 636814fc437..bd876a9e722 100644 --- a/reactos/ntoskrnl/ob/namespc.c +++ b/reactos/ntoskrnl/ob/namespc.c @@ -13,7 +13,8 @@ #include #include #include -#include +#include +#include #include #define NDEBUG @@ -64,19 +65,23 @@ NTSTATUS ZwOpenDirectoryObject(PHANDLE DirectoryHandle, { PVOID Object; NTSTATUS Status; + PWSTR Ignored; - Status = ObOpenObjectByName(ObjectAttributes,&Object); + *DirectoryHandle = 0; + + Status = ObOpenObjectByName(ObjectAttributes,&Object,&Ignored); if (!NT_SUCCESS(Status)) { return(Status); } if (BODY_TO_HEADER(Object)->Type!=OBJTYP_DIRECTORY) - { + { return(STATUS_UNSUCCESSFUL); } *DirectoryHandle = ObAddHandle(Object); + CHECKPOINT; return(STATUS_SUCCESS); } @@ -106,19 +111,24 @@ NTSTATUS ZwQueryDirectoryObject(IN HANDLE DirObjHandle, * RETURNS: Status */ { - POBJECT_HEADER hdr = ObGetObjectByHandle(DirObjHandle); - PDIRECTORY_OBJECT dir = (PDIRECTORY_OBJECT)(HEADER_TO_BODY(hdr)); + COMMON_BODY_HEADER* hdr = ObGetObjectByHandle(DirObjHandle); + PDIRECTORY_OBJECT dir = (PDIRECTORY_OBJECT)hdr; ULONG EntriesToRead; PLIST_ENTRY current_entry; POBJECT_HEADER current; ULONG i=0; ULONG EntriesToSkip; + DPRINT("ZwQueryDirectoryObject(DirObjHandle %x)\n",DirObjHandle); + DPRINT("dir %x namespc_root %x\n",dir,HEADER_TO_BODY(&(namespc_root.hdr))); + assert_irql(PASSIVE_LEVEL); EntriesToRead = BufferLength / sizeof(OBJDIR_INFORMATION); *DataWritten = 0; + DPRINT("EntriesToRead %d\n",EntriesToRead); + current_entry = dir->head.Flink; /* @@ -126,6 +136,8 @@ NTSTATUS ZwQueryDirectoryObject(IN HANDLE DirObjHandle, */ if (!IgnoreInputIndex) { + CHECKPOINT; + EntriesToSkip = *ObjectIndex; while ( ihead))) { current = CONTAINING_RECORD(current_entry,OBJECT_HEADER,entry); + DPRINT("Scanning %w\n",current->name.Buffer); + DirObjInformation[i].ObjectName.Buffer = + ExAllocatePool(NonPagedPool,current->name.Length); + DirObjInformation[i].ObjectName.Length = current->name.Length; + DirObjInformation[i].ObjectName.MaximumLength = current->name.Length; + DPRINT("DirObjInformation[i].ObjectName.Buffer %x\n", + DirObjInformation[i].ObjectName.Buffer); RtlCopyUnicodeString(&DirObjInformation[i].ObjectName, &(current->name)); i++; current_entry = current_entry->Flink; (*DataWritten) = (*DataWritten) + sizeof(OBJDIR_INFORMATION); + CHECKPOINT; } + CHECKPOINT; /* * Optionally, count the number of entries in the directory */ - if (!GetNextIndex) + if (GetNextIndex) { *ObjectIndex=i; } else { - while ( current_entry!=NULL ) + while ( current_entry!=(&(dir->head)) ) { current_entry=current_entry->Flink; i++; @@ -179,22 +202,22 @@ NTSTATUS ObReferenceObjectByName(PUNICODE_STRING ObjectPath, } NTSTATUS ObOpenObjectByName(POBJECT_ATTRIBUTES ObjectAttributes, - PVOID* Object) + PVOID* Object, PWSTR* UnparsedSection) { + NTSTATUS Status; DPRINT("ObOpenObjectByName(ObjectAttributes %x, Object %x)\n", ObjectAttributes,Object); DPRINT("ObjectAttributes = {ObjectName %x ObjectName->Buffer %w}\n", ObjectAttributes->ObjectName,ObjectAttributes->ObjectName->Buffer); - *Object = ObLookupObject(ObjectAttributes->RootDirectory, - ObjectAttributes->ObjectName->Buffer); + *Object = NULL; + Status = ObLookupObject(ObjectAttributes->RootDirectory, + ObjectAttributes->ObjectName->Buffer, + Object, + UnparsedSection); DPRINT("*Object %x\n",*Object); - if ((*Object)==NULL) - { - return(STATUS_NO_SUCH_FILE); - } - return(STATUS_SUCCESS); + return(Status); } void ObInit(void) @@ -284,30 +307,34 @@ static PVOID ObDirLookup(PDIRECTORY_OBJECT dir, PWSTR name) * NULL otherwise */ { - LIST_ENTRY* current = ((PDIRECTORY_OBJECT)dir)->head.Flink; + LIST_ENTRY* current = dir->head.Flink; POBJECT_HEADER current_obj; + DPRINT("ObDirLookup(dir %x, name %w)\n",dir,name); + if (name[0]==0) { - return(BODY_TO_HEADER(dir)); + return(dir); } if (name[0]=='.'&&name[1]==0) { - return(BODY_TO_HEADER(dir)); + return(dir); } if (name[0]=='.'&&name[1]=='.'&&name[2]==0) { - return(BODY_TO_HEADER(BODY_TO_HEADER(dir)->Parent)); + return(BODY_TO_HEADER(dir)->Parent); } - while (current!=(&((PDIRECTORY_OBJECT)dir)->head)) + while (current!=(&(dir->head))) { current_obj = CONTAINING_RECORD(current,OBJECT_HEADER,entry); + DPRINT("Scanning %w\n",current_obj->name.Buffer); if ( wcscmp(current_obj->name.Buffer, name)==0) { - return(current_obj); + return(HEADER_TO_BODY(current_obj)); } current = current->Flink; } + DPRINT("%s() = NULL\n",__FUNCTION__); return(NULL); } @@ -323,11 +350,6 @@ VOID ObCreateEntry(PDIRECTORY_OBJECT parent,POBJECT_HEADER Object) { DPRINT("ObjCreateEntry(%x,%x,%x,%w)\n",parent,Object,Object->name.Buffer, Object->name.Buffer); - DPRINT("root type %d\n",namespc_root.hdr.Type); - DPRINT("%x\n",&(namespc_root.hdr.Type)); - DPRINT("type %x\n",&(parent->Type)); - DPRINT("type %x\n",&(BODY_TO_HEADER(parent)->Type)); - DPRINT("type %d\n",parent->Type); assert(parent->Type == OBJTYP_DIRECTORY); /* @@ -336,7 +358,8 @@ VOID ObCreateEntry(PDIRECTORY_OBJECT parent,POBJECT_HEADER Object) InsertTailList(&parent->head,&Object->entry); } -PVOID ObLookupObject(HANDLE rooth, PWSTR string) +NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object, + PWSTR* UnparsedSection) /* * FUNCTION: Lookup an object within the system namespc * ARGUMENTS: @@ -349,17 +372,23 @@ PVOID ObLookupObject(HANDLE rooth, PWSTR string) PWSTR current; PWSTR next; PDIRECTORY_OBJECT current_dir = NULL; - POBJECT_HEADER current_hdr; + NTSTATUS Status; - DPRINT("root %x string %w\n",rooth,string); + DPRINT("ObLookupObject(rootdir %x, string %x, string %w, Object %x, " + "UnparsedSection %x)\n",rootdir,string,string,Object, + UnparsedSection); + - if (rooth==NULL) + *UnparsedSection = NULL; + *Object = NULL; + + if (rootdir==NULL) { current_dir = HEADER_TO_BODY(&(namespc_root.hdr)); } else { - ObReferenceObjectByHandle(rooth,DIRECTORY_TRAVERSE,NULL, + ObReferenceObjectByHandle(rootdir,DIRECTORY_TRAVERSE,NULL, UserMode,(PVOID*)¤t_dir,NULL); } @@ -368,74 +397,90 @@ PVOID ObLookupObject(HANDLE rooth, PWSTR string) */ if (string[0]==0) { - DPRINT("current_dir %x\n",current_dir); - DPRINT("type %d\n",current_dir->Type); - return(current_dir); + *Object=current_dir; + return(STATUS_SUCCESS); } - DPRINT("string = %w\n",string); - if (string[0]!='\\') { DbgPrint("(%s:%d) Non absolute pathname passed to %s\n",__FILE__, __LINE__,__FUNCTION__); - return(NULL); + return(STATUS_UNSUCCESSFUL); } - current = string+1; - DPRINT("current %w\n",current); - next = wcschr(string+1,'\\'); - if (next!=NULL) - { - *next=0; - } - DPRINT("next %x\n",next); + next = &string[0]; + current = next+1; - while (next!=NULL) - { - DPRINT("Scanning %w next %w current %x\n",current,next+1, - current_dir); - - /* - * Check the current object is a directory - */ - if (current_dir->Type!=OBJTYP_DIRECTORY) - { - DbgPrint("(%s:%d) Bad path component\n",__FILE__, - __LINE__); - ExFreePool(string); - return(NULL); - } - - /* - * Lookup the next component of the path in the directory - */ - current_hdr=(PDIRECTORY_OBJECT)ObDirLookup(current_dir,current); - if (current_hdr==NULL) - { - DbgPrint("(%s:%d) Path component not found\n",__FILE__, - __LINE__); - ExFreePool(string); - return(NULL); - } - current_dir = HEADER_TO_BODY(current_hdr); - + while (next!=NULL && current_dir->Type==OBJTYP_DIRECTORY) + { + *next = '\\'; current = next+1; next = wcschr(next+1,'\\'); if (next!=NULL) { *next=0; } + + DPRINT("current %w current[5] %x next %x ",current,current[5],next); + if (next!=NULL) + { + DPRINT("(next+1) %w",next+1); + } + DPRINT("\n",0); + + current_dir=(PDIRECTORY_OBJECT)ObDirLookup(current_dir,current); + if (current_dir==NULL) + { + DbgPrint("(%s:%d) Path component not found\n",__FILE__, + __LINE__); + ExFreePool(string); + return(STATUS_UNSUCCESSFUL); + } + + DPRINT("current_dir %x\n",current_dir); + DPRINT("current_dir->Type %d OBJTYP_SYMLNK %d OBJTYP_DIRECTORY %d\n", + current_dir->Type,OBJTYP_SYMLNK,OBJTYP_DIRECTORY); + DPRINT("&(current_dir->Type) %x\n",&(current_dir->Type)); + if (current_dir->Type==OBJTYP_SYMLNK) + { + current_dir = IoOpenSymlink(current_dir); + } + } + DPRINT("next %x\n",next); + DPRINT("current %x current %w\n",current,current); + if (next==NULL) + { + if (current_dir==NULL) + { + Status = STATUS_UNSUCCESSFUL; + } + else + { + Status = STATUS_SUCCESS; + } + } + else + { + CHECKPOINT; + *next = '\\'; + *UnparsedSection = next; + switch(current_dir->Type) + { + case OBJTYP_DEVICE: + CHECKPOINT; + Status = STATUS_FS_QUERY_REQUIRED; + break; + + default: + current_dir = NULL; + Status = STATUS_UNSUCCESSFUL; + break; + } + } + CHECKPOINT; + *Object = current_dir; - DPRINT("current_dir %x current %x\n",current_dir,current); - DPRINT("current %w\n",current); - current_hdr = ObDirLookup(current_dir,current); - if (current_hdr==NULL) - { - return(NULL); - } - DPRINT("Returning %x %x\n",current_hdr,HEADER_TO_BODY(current_hdr)); - return(HEADER_TO_BODY(current_hdr)); + return(Status); } diff --git a/reactos/ntoskrnl/ob/object.c b/reactos/ntoskrnl/ob/object.c index 10011ca197b..757b09b07df 100644 --- a/reactos/ntoskrnl/ob/object.c +++ b/reactos/ntoskrnl/ob/object.c @@ -11,7 +11,7 @@ /* INCLUDES *****************************************************************/ #include -#include +#include #include #define NDEBUG @@ -41,9 +41,10 @@ PVOID ObGenericCreateObject(PHANDLE Handle, PWSTR path; PWSTR name; PDIRECTORY_OBJECT parent; + PWSTR Ignored; DPRINT("ObGenericCreateObject(Handle %x, DesiredAccess %x," - "ObjectAttributes %x, Type %x)\n",Handle,DesiredAccess,ObjectAttributes, + "ObjectAttributes %x, Type %d)\n",Handle,DesiredAccess,ObjectAttributes, Type); /* @@ -96,8 +97,9 @@ PVOID ObGenericCreateObject(PHANDLE Handle, name=name+1; } - hdr->Parent = ObLookupObject(ObjectAttributes->RootDirectory,path); - + ObLookupObject(ObjectAttributes->RootDirectory,path, + &hdr->Parent,&Ignored); + /* * Initialize the object header */ @@ -168,6 +170,9 @@ VOID ObInitializeObjectHeader(CSHORT id, PWSTR name, RtlInitUnicodeString(&obj->name,name); DPRINT("name %w\n",obj->name.Buffer); } + DPRINT("obj->Type %d\n",obj->Type); + DPRINT("obj %x\n",obj); + DPRINT("&(obj->Type) %x\n",&(obj->Type)); } diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index 043508483d6..eb363ad457d 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -12,6 +12,7 @@ #include +#define NDEBUG #include /* GLOBALS ******************************************************************/ @@ -21,10 +22,14 @@ HANDLE SystemProcessHandle = NULL; /* FUNCTIONS *****************************************************************/ +VOID PsInitProcessManagment(VOID) +{ + InitializeListHead(&(SystemProcess.Pcb.MemoryAreaList)); +} + PKPROCESS KeGetCurrentProcess(VOID) { - return(NULL); -// return(&(PsGetCurrentProcess()->Pcb)); + return(&(PsGetCurrentProcess()->Pcb)); } struct _EPROCESS* PsGetCurrentProcess(VOID) @@ -32,6 +37,7 @@ struct _EPROCESS* PsGetCurrentProcess(VOID) * FUNCTION: Returns a pointer to the current process */ { + DPRINT("PsGetCurrentProcess() = %x\n",PsGetCurrentThread()->ThreadsProcess); return(PsGetCurrentThread()->ThreadsProcess); } diff --git a/reactos/ntoskrnl/ps/psmgr.c b/reactos/ntoskrnl/ps/psmgr.c index f90f4a7ffe8..90cbf7b6427 100644 --- a/reactos/ntoskrnl/ps/psmgr.c +++ b/reactos/ntoskrnl/ps/psmgr.c @@ -1,7 +1,7 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel - * FILE: kernel/psmgr/psmgr.c + * FILE: ntoskrnl/ps/psmgr.c * PURPOSE: Process managment * PROGRAMMER: David Welch (welch@mcmail.com) */ @@ -10,13 +10,14 @@ #include #include -#include +#include /* FUNCTIONS ***************************************************************/ VOID PsInit(VOID) { ObjInitializeHandleTable(NULL); + PsInitProcessManagment(); PsInitThreadManagment(); PsInitIdleThread(); } diff --git a/reactos/ntoskrnl/ps/thread.c b/reactos/ntoskrnl/ps/thread.c index 017ab56f6a5..63fabd7a13f 100644 --- a/reactos/ntoskrnl/ps/thread.c +++ b/reactos/ntoskrnl/ps/thread.c @@ -21,10 +21,10 @@ #include #include #include -#include +#include #include #include -#include +#include #define NDEBUG #include @@ -150,7 +150,7 @@ void PsDispatchThread(void) if (current->ThreadState == THREAD_STATE_RUNNABLE && current != (PKTHREAD)CurrentThread) { - DPRINT("Scheduling this one %x\n",current); + DPRINT("Scheduling this one %x\n",current); CurrentThread = current; CurrentThread->Tcb.ThreadState = THREAD_STATE_RUNNING; KeReleaseSpinLock(&ThreadListLock,irql); diff --git a/reactos/ntoskrnl/rtl/unicode.c b/reactos/ntoskrnl/rtl/unicode.c index fb0fc276ebf..b30b3395d31 100644 --- a/reactos/ntoskrnl/rtl/unicode.c +++ b/reactos/ntoskrnl/rtl/unicode.c @@ -22,6 +22,15 @@ #define Aa_Difference 'A'-'a'; +PUNICODE_STRING RtlDuplicateUnicodeString(PUNICODE_STRING Dest, + PUNICODE_STRING Src) +{ + if (Dest==NULL) + { + Dest=ExAllocatePool(NonPagedPool,sizeof(UNICODE_STRING)); + } +} + VOID RtlUpperString(PSTRING DestinationString, PSTRING SourceString) { UNIMPLEMENTED; @@ -44,7 +53,7 @@ NTSTATUS RtlAnsiStringToUnicodeString(IN OUT PUNICODE_STRING DestinationString, unsigned long i; if(AllocateDestinationString==TRUE) { - DestinationString->Buffer=ExAllocatePool(NonPagedPool, SourceString->Length*2+1); + DestinationString->Buffer=ExAllocatePool(NonPagedPool, (SourceString->Length+1)*2); DestinationString->MaximumLength=SourceString->Length; }; diff --git a/reactos/ntoskrnl/rtl/vsprintf.c b/reactos/ntoskrnl/rtl/vsprintf.c index 35e2d5caf0b..c8039b03f72 100644 --- a/reactos/ntoskrnl/rtl/vsprintf.c +++ b/reactos/ntoskrnl/rtl/vsprintf.c @@ -222,10 +222,25 @@ int vsprintf(char *buf, const char *fmt, va_list args) case 'w': sw = va_arg(args,short int *); // DPRINT("L %x\n",sw); - while ((*sw)!=0) + if (sw==NULL) { - *str++ = (char)(*sw++); +// CHECKPOINT; + s = ""; + while ((*s)!=0) + { + *str++ = *s++; + } +// CHECKPOINT; +// DbgPrint("str %x\n",str); } + else + { + while ((*sw)!=0) + { + *str++ = (char)(*sw++); + } + } +// CHECKPOINT; continue; case 's': diff --git a/reactos/ntoskrnl/tst/sshell.c b/reactos/ntoskrnl/tst/sshell.c index 66eade7c80f..59d64448e41 100644 --- a/reactos/ntoskrnl/tst/sshell.c +++ b/reactos/ntoskrnl/tst/sshell.c @@ -18,16 +18,15 @@ #define NDEBUG #include -#include - int ShellChangeDir(char* args); int ShellListDir(char* args); +VOID TstReadLineInit(VOID); +VOID TstReadLine(ULONG Length, PCHAR Buffer); /* GLOBALS ******************************************************************/ -static HANDLE CurrentDirHandle; -static UNICODE_STRING CurrentDirName; -static HANDLE KeyboardHandle; +static HANDLE CurrentDirHandle = NULL; +static UNICODE_STRING CurrentDirName = {NULL,0,0}; typedef struct { @@ -50,22 +49,28 @@ int ShellChangeDir(char* args) int ShellListDir(char* args) { + OBJDIR_INFORMATION DirObj[50]; + ULONG Idx; + ULONG Length; + ULONG i; + + ZwQueryDirectoryObject(CurrentDirHandle, + &(DirObj[0]), + sizeof(DirObj), + TRUE, + TRUE, + &Idx, + &Length); + + for (i=0;i<(Length/sizeof(OBJDIR_INFORMATION));i++) + { + DbgPrint("Scanning %w\n",DirObj[i].ObjectName.Buffer); + } } VOID ShellDisplayPrompt() { - printk("%w# ",CurrentDirName->Buffer); -} - -VOID ShellGetCommand(char* cmd) -{ - do - { - ZwReadFile(hfile,NULL,NULL,NULL,NULL,cmd,1,0,0); - printk("%c",*cmd); - cmd++; - } while((*cmd)!='\n'); - *cmd=0; + printk("%w# ",CurrentDirName.Buffer); } VOID ShellProcessCommand(char* cmd) @@ -88,6 +93,7 @@ NTSTATUS TstShell(VOID) OBJECT_ATTRIBUTES attr; char cmd[255]; + RtlInitAnsiString(&astr,"\\"); RtlAnsiStringToUnicodeString(&CurrentDirName,&astr,TRUE); @@ -95,17 +101,14 @@ NTSTATUS TstShell(VOID) RtlAnsiStringToUnicodeString(&ufilename,&afilename,TRUE); InitializeObjectAttributes(&attr,&ufilename,0,NULL,NULL); ZwOpenDirectoryObject(&CurrentDirHandle,0,&attr); - - RtlInitAnsiString(&afilename,"\\Device\\Keyboard"); - RtlAnsiStringToUnicodeString(&ufilename,&afilename,TRUE); - InitializeObjectAttributes(&attr,&ufilename,0,NULL,NULL); - ZwOpenFile(&KeyboardHandle,0,&attr,NULL,0,0); + TstReadLineInit(); + for(;;) { ShellDisplayPrompt(); - ShellGetCommand(cmd); + TstReadLine(255,cmd); ShellProcessCommand(cmd); } } diff --git a/reactos/rules.mak b/reactos/rules.mak index f862439ba07..283a1b645d3 100644 --- a/reactos/rules.mak +++ b/reactos/rules.mak @@ -45,7 +45,7 @@ endif DEFINES = -DCHECKED_BUILD -DWIN32_LEAN_AND_MEAN -DDBG CC = $(PREFIX)gcc NATIVE_CC = gcc -CFLAGS = -O2 -I../../include -I../include -fno-builtin $(DEFINES) -Wall -Wstrict-prototypes +CFLAGS = -O2 -I../../../include -I../../include -I../include -fno-builtin $(DEFINES) -Wall -Wstrict-prototypes CXXFLAGS = $(CFLAGS) NASM = nasm NFLAGS = -i../include/ -f$(NASM_FORMAT)