From 1be4f77bcb6671162aadda0e99ae3305d1bc7ca6 Mon Sep 17 00:00:00 2001 From: David Welch Date: Sun, 26 Mar 2000 22:00:10 +0000 Subject: [PATCH] Corrected the handle generation algorithm in the kernel and csrss Did some work on services.exe Did some work on the service functions in advapi32 Made some progress in implementing npfs Implemented a basic grammar for midl svn path=/trunk/; revision=1091 --- reactos/apps/utils/objdir/makefile | 46 ++++ reactos/apps/utils/objdir/objdir.c | 45 ++++ reactos/drivers/fs/np/create.c | 118 ++++++--- reactos/drivers/fs/np/mount.c | 66 +----- reactos/drivers/fs/np/npfs.h | 23 +- reactos/drivers/fs/np/rw.c | 81 +++++++ reactos/drivers/services/makefile | 63 +++++ reactos/drivers/services/services.c | 77 ++++++ reactos/drivers/services/services.rc | 38 +++ reactos/include/ddk/iotypes.h | 14 +- reactos/include/ddk/zw.h | 6 +- reactos/include/security.h | 2 + reactos/include/services/services.h | 35 +++ reactos/include/structs.h | 4 +- reactos/lib/advapi32/makefile | 4 +- reactos/lib/advapi32/service/scm.c | 220 ++++++----------- reactos/lib/advapi32/service/sctrl.c | 236 ++++++++++++++++++ reactos/lib/advapi32/service/undoc.c | 50 ++++ reactos/lib/kernel32/file/rw.c | 28 ++- reactos/lib/kernel32/misc/console.c | 8 + reactos/lib/rpcrt4/midl/Makefile | 53 +++++ reactos/lib/rpcrt4/midl/hello.idl | 10 + reactos/lib/rpcrt4/midl/idl.l | 88 +++++++ reactos/lib/rpcrt4/midl/idl.y | 91 +++++++ reactos/lib/rpcrt4/midl/interface.c | 74 ++++++ reactos/lib/rpcrt4/midl/midl.c | 79 +++++++ reactos/lib/rpcrt4/midl/midl.h | 37 +++ reactos/lib/rpcrt4/midl/option.c | 16 ++ reactos/lib/rpcrt4/midl/types.c | 62 +++++ reactos/lib/rpcrt4/midl/types.h | 33 +++ reactos/ntoskrnl/io/npipe.c | 101 +++++++- reactos/ntoskrnl/io/symlink.c | 65 ++--- reactos/ntoskrnl/ob/dirobj.c | 341 +++++++++++++-------------- reactos/ntoskrnl/ob/handle.c | 12 +- reactos/subsys/csrss/api/handle.c | 8 +- 35 files changed, 1743 insertions(+), 491 deletions(-) create mode 100644 reactos/apps/utils/objdir/makefile create mode 100644 reactos/apps/utils/objdir/objdir.c create mode 100644 reactos/drivers/fs/np/rw.c create mode 100644 reactos/drivers/services/makefile create mode 100644 reactos/drivers/services/services.c create mode 100644 reactos/drivers/services/services.rc create mode 100644 reactos/include/services/services.h create mode 100644 reactos/lib/advapi32/service/sctrl.c create mode 100644 reactos/lib/advapi32/service/undoc.c create mode 100644 reactos/lib/rpcrt4/midl/Makefile create mode 100644 reactos/lib/rpcrt4/midl/hello.idl create mode 100644 reactos/lib/rpcrt4/midl/idl.l create mode 100644 reactos/lib/rpcrt4/midl/idl.y create mode 100644 reactos/lib/rpcrt4/midl/interface.c create mode 100644 reactos/lib/rpcrt4/midl/midl.c create mode 100644 reactos/lib/rpcrt4/midl/midl.h create mode 100644 reactos/lib/rpcrt4/midl/option.c create mode 100644 reactos/lib/rpcrt4/midl/types.c create mode 100644 reactos/lib/rpcrt4/midl/types.h diff --git a/reactos/apps/utils/objdir/makefile b/reactos/apps/utils/objdir/makefile new file mode 100644 index 00000000000..4e8ebf63d1e --- /dev/null +++ b/reactos/apps/utils/objdir/makefile @@ -0,0 +1,46 @@ +# +# +# +OBJECTS= objdir.o + + +PROGS= objdir.exe + +BASE_CFLAGS = -I../../include +LIBS = ../../lib/ntdll/ntdll.a + +all: $(PROGS) + +.phony: all + +clean: + - $(RM) objdir.o + - $(RM) objdir.exe + - $(RM) objdir.sym + +.phony: clean + +floppy: $(PROGS:%=$(FLOPPY_DIR)/apps/%) + +$(PROGS:%=$(FLOPPY_DIR)/apps/%): $(FLOPPY_DIR)/apps/%: % +ifeq ($(DOSCLI),yes) + $(CP) $* $(FLOPPY_DIR)\apps\$* +else + $(CP) $* $(FLOPPY_DIR)/apps/$* +endif + +dist: $(PROGS:%=../../$(DIST_DIR)/apps/%) + +$(PROGS:%=../../$(DIST_DIR)/apps/%): ../../$(DIST_DIR)/apps/%: % +ifeq ($(DOSCLI),yes) + $(CP) $* ..\..\$(DIST_DIR)\apps\$* +else + $(CP) $* ../../$(DIST_DIR)/apps/$* +endif + +objdir.exe: $(OBJECTS) $(LIBS) + $(LD) $(OBJECTS) $(LIBS) -o objdir.exe + $(NM) --numeric-sort objdir.exe > objdir.sym + + +include ../../rules.mak diff --git a/reactos/apps/utils/objdir/objdir.c b/reactos/apps/utils/objdir/objdir.c new file mode 100644 index 00000000000..e3e74f42f42 --- /dev/null +++ b/reactos/apps/utils/objdir/objdir.c @@ -0,0 +1,45 @@ +/* $Id: objdir.c,v 1.1 2000/03/26 22:00:06 dwelch Exp $ + * + * DESCRIPTION: Simple LPC Server + * PROGRAMMER: David Welch + */ + +#include +#include +#include +#include +#include + +int main(int argc, char* argv[]) +{ + UNICODE_STRING DirectoryNameW; + UNICODE_STRING DirectoryNameA: + OBJECT_ATTRIBUTES ObjectAttributes; + NTSTATUS Status; + HANDLE DirectoryHandle; + + RtlInitAnsiString(&DirectoryNameA, argv[1]); + RtlAnsiStringToUnicodeString(&DirectoryNameW, + &DirectoryNameA, + TRUE); + InitializeObjectAttributes(&ObjectAttributes, + &DirectoryNameW, + 0, + NULL, + NULL); + Status = NtOpenDirectoryObject(&DirectoryHandle, + 0, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + printf("Failed to open directory object (Status%x)\n", Status); + return(EXIT_FAILURE); + } + + NtClose(DirectoryHandle); + + return EXIT_SUCCESS; +} + + +/* EOF */ diff --git a/reactos/drivers/fs/np/create.c b/reactos/drivers/fs/np/create.c index def56ba908b..fd7fac1be75 100644 --- a/reactos/drivers/fs/np/create.c +++ b/reactos/drivers/fs/np/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.2 1999/12/04 20:58:42 ea Exp $ +/* $Id: create.c,v 1.3 2000/03/26 22:00:09 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -18,49 +18,107 @@ /* FUNCTIONS *****************************************************************/ -NTSTATUS NpfsCreatePipe(PNPFS_DEVICE_EXTENSION DeviceExt, - PFILE_OBJECT FileObject) +NTSTATUS NpfsCreate(PDEVICE_OBJECT DeviceObject, + PIRP Irp) { - PWSTR PipeName; - PNPFS_FSCONTEXT PipeDescr; - NTSTATUS Status; - - PipeName = wcsrchr(FileObject->FileName.Buffer, L'\\'); - if (PipeName == NULL) - { - PipeName = FileObject->FileName.Buffer; - } - - PipeDescr = ExAllocatePool(NonPagedPool, sizeof(NPFS_FSCONTEXT)); - if (PipeDescr == NULL) - { - return(STATUS_NO_MEMORY); - } - - Status = NpfsCreateEntry(PipeName, PipeDescr); - if (!NT_SUCCESS(Status)) - { - ExFreePool(PipeDescr); - return(Status); - } - - FileObject->FsContext = PipeDescr; - return(Status); } -NTSTATUS NpfsCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp) +NTSTATUS NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, PIRP Irp) { PIO_STACK_LOCATION IoStack; PFILE_OBJECT FileObject; NTSTATUS Status; PNPFS_DEVICE_EXTENSION DeviceExt; + PWSTR PipeName; + PNPFS_FSCONTEXT PipeDescr; + NTSTATUS Status; + KIRQL oldIrql; + PLIST_ENTRY current_entry; + PNPFS_CONTEXT current; DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension; IoStack = IoGetCurrentIrpStackLocation(Irp); FileObject = IoStack->FileObject; - Status = NpfsCreatePipe(DeviceExt, FileObject); + PipeName = FileObject->FileName.Buffer; + + PipeDescr = ExAllocatePool(NonPagedPool, sizeof(NPFS_FSCONTEXT)); + if (PipeDescr == NULL) + { + Irp->IoStatus.Status = STATUS_NO_MEMORY; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return(STATUS_NO_MEMORY); + } + PipeDescr->Name = ExAllocatePool(NonPagedPool, + (wcslen(PipeName) + 1) * sizeof(WCHAR)); + if (PipeDescr->Name == NULL) + { + ExFreePool(PipeDescr); + + Irp->IoStatus.Status = STATUS_NO_MEMORY; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + + wcscpy(PipeDescr->Name, PipeName); + PipeDescr->FileAttributes = + IoStack->Parameters.CreateNamedPipe.FileAttributes; + PipeDescr->OpenMode = + IoStack->Parameters.CreateNamedPipe.OpenMode; + PipeDescr->PipeType = + IoStack->Parameters.CreateNamedPipe.PipeType; + PipeDescr->PipeRead = + IoStack->Parameters.CreateNamedPipe.PipeRead; + PipeDescr->PipeWait = + IoStack->Parameters.CreateNamedPipe.PipeWait; + PipeDescr->MaxInstances = + IoStack->Parameters.CreateNamedPipe.MaxInstances; + PipeDescr->InBufferSize = + IoStack->Parameters.CreateNamedPipe.InBufferSize; + PipeDescr->OutBufferSize = + IoStack->Parameters.CreateNamedPipe.OutBufferSize; + PipeDescr->Timeout = + IoStack->Parameters.CreateNamedPipe.Timeout; + KeInitializeSpinLock(&PipeDescr->MsgListLock); + InitializeListHead(&PipeDescr->MsgListHead); + + /* + * Check for duplicate names + */ + KeAcquireSpinLock(&PipeListLock, &oldIrql); + current_entry = PipeListHead.Flink; + while (current_entry != &PipeListHead) + { + current = CONTAINING_RECORD(current_entry, + NPFS_FSCONTEXT, + ListEntry); + + if (wcscmp(current->Name, PipeDescr->Name) == 0) + { + KeReleaseSpinLock(&PipeListLock, oldIrql); + ExFreePool(PipeDescr->Name); + ExFreePool(PipeDescr); + + Irp->IoStatus.Status = STATUS_OBJECT_NAME_COLLISION; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + + current_entry = current_entry->Flink; + } + InsertTailList(&PipeListHead, + &PipeDescr->ListEntry); + KeReleaseSpinLock(&PipeListLock, oldIrql); + + + + FileObject->FsContext = PipeDescr; Irp->IoStatus.Status = Status; Irp->IoStatus.Information = 0; diff --git a/reactos/drivers/fs/np/mount.c b/reactos/drivers/fs/np/mount.c index e2040b7e438..1c110a6e27b 100644 --- a/reactos/drivers/fs/np/mount.c +++ b/reactos/drivers/fs/np/mount.c @@ -1,4 +1,4 @@ -/* $Id: mount.c,v 1.2 1999/12/04 20:58:42 ea Exp $ +/* $Id: mount.c,v 1.3 2000/03/26 22:00:09 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -20,60 +20,18 @@ static PDRIVER_OBJECT DriverObject; +LIST_ENTRY PipeListHead; +KSPIN_LOCK PipeListLock; + /* FUNCTIONS *****************************************************************/ -NTSTATUS NpfsMount(PDEVICE_OBJECT DeviceToMount) -{ - NTSTATUS Status; - PDEVICE_OBJECT DeviceObject; - PNPFS_DEVICE_EXTENSION DeviceExt; - - Status = IoCreateDevice(DriverObject, - sizeof(NPFS_DEVICE_EXTENSION), - NULL, - FILE_DEVICE_FILE_SYSTEM, - 0, - FALSE, - &DeviceObject); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - DeviceObject->Flags = DeviceObject->Flags | DO_DIRECT_IO; - DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - DeviceExt->StorageDevice = IoAttachDeviceToDeviceStack(DeviceObject, - DeviceToMount); - - return(STATUS_SUCCESS); -} - -NTSTATUS NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, - PIRP Irp) -{ - PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp); - PVPB Vpb = IoStack->Parameters.Mount.Vpb; - PDEVICE_OBJECT DeviceToMount = IoStack->Parameters.Mount.DeviceObject; - NTSTATUS Status; - - Status = NpfsMount(DeviceToMount); - - Irp->IoStatus.Status = Status; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return(Status); - -} - NTSTATUS DriverEntry(PDRIVER_OBJECT _DriverObject, PUNICODE_STRING RegistryPath) { PDEVICE_OBJECT DeviceObject; NTSTATUS Status; UNICODE_STRING DeviceName; + UNICODE_STRING LinkName; DbgPrint("Named Pipe Filesystem\n"); @@ -92,13 +50,17 @@ NTSTATUS DriverEntry(PDRIVER_OBJECT _DriverObject, return(Status); } + RtlInitUnicodeString(&LinkName, L"\\??\\pipe"); + Status = IoCreateSymbolicLink(&LinkName, + &DeviceName); + DeviceObject->Flags = 0; DeviceObject->MajorFunction[IRP_MJ_CLOSE] = NpfsClose; + DeviceObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = + NpfsCreateNamedPipe; DeviceObject->MajorFunction[IRP_MJ_CREATE] = NpfsCreate; DeviceObject->MajorFunction[IRP_MJ_READ] = NpfsRead; DeviceObject->MajorFunction[IRP_MJ_WRITE] = NpfsWrite; - DeviceObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = - NpfsFileSystemControl; DeviceObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = NpfsDirectoryControl; DeviceObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = @@ -112,15 +74,9 @@ NTSTATUS DriverEntry(PDRIVER_OBJECT _DriverObject, NpfsQuerySecurity; DeviceObject->MajorFunction[IRP_MJ_SET_SECURITY] = NpfsSetSecurity; - DeviceObject->MajorFunction[IRP_MJ_QUERY_QUOTA] = - NpfsQueryQuota; - DeviceObject->MajorFunction[IRP_MJ_SET_QUOTA] = - NpfsSetQuota; DriverObject->DriverUnload = NULL; - IoRegisterFileSystem(DeviceObject); - return(STATUS_SUCCESS); } diff --git a/reactos/drivers/fs/np/npfs.h b/reactos/drivers/fs/np/npfs.h index 3c26ffdd4f8..42b04d9ab3e 100644 --- a/reactos/drivers/fs/np/npfs.h +++ b/reactos/drivers/fs/np/npfs.h @@ -8,18 +8,29 @@ typedef struct typedef struct { - LIST_ENTRY ListEntry; PVOID Buffer; - ULONG Length; + ULONG Size; + LIST_ENTRY ListEntry; } NPFS_MSG, *PNPFS_MSG; typedef struct { - LIST_ENTRY DirectoryListEntry; - LIST_ENTRY GlobalListEntry; - ULONG Flags; - LIST_ENTRY MsgListHead; + LIST_ENTRY ListEntry; + PWSTR Name; + ULONG FileAttributes; + ULONG OpenMode; + ULONG PipeType; + ULONG PipeRead; + ULONG PipeWait; + ULONG MaxInstances; + ULONG InBufferSize; + ULONG OutBufferSize; + LARGE_INTEGER Timeout; KSPIN_LOCK MsgListLock; + LIST_ENTRY MsgListHead; } NPFS_FSCONTEXT, *PNPFS_FSCONTEXT; +extern LIST_ENTRY PipeListHead; +extern KSPIN_LOCK PipeListLock; + #endif /* __SERVICES_FS_NP_NPFS_H */ diff --git a/reactos/drivers/fs/np/rw.c b/reactos/drivers/fs/np/rw.c new file mode 100644 index 00000000000..9bac22a0b03 --- /dev/null +++ b/reactos/drivers/fs/np/rw.c @@ -0,0 +1,81 @@ +/* $Id: rw.c,v 1.1 2000/03/26 22:00:09 dwelch Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: services/fs/np/rw.c + * PURPOSE: Named pipe filesystem + * PROGRAMMER: David Welch + */ + +/* INCLUDES ******************************************************************/ + +#include + +//#define NDEBUG +#include + +#include "npfs.h" + +/* FUNCTIONS *****************************************************************/ + +NTSTATUS NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) +{ + PIO_STACK_LOCATION IoStack; + PFILE_OBJECT FileObject; + NTSTATUS Status; + PNPFS_DEVICE_EXTENSION DeviceExt; + PWSTR PipeName; + PNPFS_FSCONTEXT PipeDescr; + NTSTATUS Status; + KIRQL oldIrql; + PLIST_ENTRY current_entry; + PNPFS_CONTEXT current; + ULONG Information; + + DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + IoStack = IoGetCurrentIrpStackLocation(Irp); + FileObject = IoStack->FileObject; + PipeDescr = FileObject->FsContext; + + if (PipeType & NPFS_READMODE_BYTE) + { + PLIST_ENTRY current_entry; + PNPFS_MSG current; + KIRQL oldIrql; + ULONG Length; + PVOID Buffer; + + KeAcquireSpinLock(&PipeDescr->MsgListLock, &oldIrql); + current_entry = PipeDescr->MsgListHead.Flink; + Information = 0; + Length = IoStack->Parameters.Read.Length; + Buffer = MmGetSystemAddressForMdl(Irp->MdlAddress); + while (Length > 0 && + current_entry != &PipeDescr->MsgListHead) + { + current = CONTAINING_RECORD(current_entry, + NPFS_MSG, + ListEntry); + + memcpy(Buffer, current->Buffer, current->Length); + Buffer = Buffer + current->Length; + Length = Length - current->Length; + Information = Information + current->Length; + + current_entry = current_entry->Flink; + } + } + else + { + } + + Irp->IoStatus.Status = Status; + Irp->IoStatus.Information = Information; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return(Status); +} + + +/* EOF */ diff --git a/reactos/drivers/services/makefile b/reactos/drivers/services/makefile new file mode 100644 index 00000000000..713ef1c2cb4 --- /dev/null +++ b/reactos/drivers/services/makefile @@ -0,0 +1,63 @@ +# $Id: makefile,v 1.1 2000/03/26 22:00:09 dwelch Exp $ +# +# CSRSS: Client/server runtime subsystem +# +# ReactOS Operating System +# +TARGET = services + +BASE_CFLAGS = -I../../include -I. + +OBJECTS = + +LIBS = ../../lib/ntdll/ntdll.a + +all: $(TARGET).exe + +.phony: all + +clean: + - $(RM) api/*.o + - $(RM) sbapi/*.o + - $(RM) *.o + - $(RM) $(TARGET).exe + - $(RM) $(TARGET).sym + - $(RM) $(TARGET).coff + +.phony: clean + +$(TARGET).coff: $(TARGET).rc + $(RC) $(TARGET).rc $(TARGET).coff + +$(TARGET).exe: $(OBJECTS) $(LIBS) + $(LD) \ + $(OBJECTS) \ + $(LIBS) \ + -o $(TARGET).exe \ + --subsystem native + $(NM) --numeric-sort $(TARGET).exe > $(TARGET).sym + + +floppy: $(FLOPPY_DIR)/subsys/$(TARGET).exe + +$(FLOPPY_DIR)/subsys/$(TARGET).exe: $(TARGET).exe +ifeq ($(DOSCLI),yes) + $(CP) $(TARGET).exe $(FLOPPY_DIR)\subsys\$(TARGET).exe +else + $(CP) $(TARGET).exe $(FLOPPY_DIR)/subsys/$(TARGET).exe +endif + + +dist: $(DIST_DIR)/subsys/$(TARGET).exe + +$(DIST_DIR)/subsys/$(TARGET).exe: $(TARGET).exe +ifeq ($(DOSCLI),yes) + $(CP) $(TARGET).exe ..\..\$(DIST_DIR)\subsys\$(TARGET).exe +else + $(CP) $(TARGET).exe ../../$(DIST_DIR)/subsys/$(TARGET).exe +endif + + +include ../../rules.mak + +# EOF diff --git a/reactos/drivers/services/services.c b/reactos/drivers/services/services.c new file mode 100644 index 00000000000..61527cc1a29 --- /dev/null +++ b/reactos/drivers/services/services.c @@ -0,0 +1,77 @@ +/* $Id: services.c,v 1.1 2000/03/26 22:00:09 dwelch Exp $ + * + * service control manager + * + * ReactOS Operating System + * + * -------------------------------------------------------------------- + * + * This software is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING.LIB. If not, write + * to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, + * MA 02139, USA. + * + */ + +#include +#include +#include + +VOID ServicesInitialization(VOID) +{ + +} + +/* Native process' entry point */ + +VOID NtProcessStartup(PPEB Peb) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE ServicesInitEvent; + UNICODE_STRING UnicodeString; + NTSTATUS Status; + + DisplayString(L"Service Control Manager\n"); + + RtlInitUnicodeString(&UnicodeString, + L"\\ServicesInitDone"); + InitializeObjectAttributes(&ObjectAttributes, + &UnicodeString, + EVENT_ALL_ACCESS, + 0, + NULL); + Status = NtOpenEvent(&ServicesInitEvent, + EVENT_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DbgPrint("SERVICES: Failed to open notification event\n"); + } + + Status = ServicesInitialization (); + + if (!NT_SUCCESS(Status)) + { + DisplayString( L"SERVICES: Subsystem failed to initialize.\n" ); + + NtTerminateProcess(NtCurrentProcess(), Status); + } + + + DisplayString( L"CSR: Subsystem initialized.\n" ); + + NtSetEvent(ServicesInitEvent, NULL); + NtTerminateThread(NtCurrentThread(), STATUS_SUCCESS); +} + +/* EOF */ diff --git a/reactos/drivers/services/services.rc b/reactos/drivers/services/services.rc new file mode 100644 index 00000000000..c2ecd4d2f60 --- /dev/null +++ b/reactos/drivers/services/services.rc @@ -0,0 +1,38 @@ +#include "../../include/defines.h" +#include "../../include/reactos/resource.h" + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +VS_VERSION_INFO VERSIONINFO + FILEVERSION RES_UINT_FV_MAJOR,RES_UINT_FV_MINOR,RES_UINT_FV_REVISION,RES_UINT_FV_BUILD + PRODUCTVERSION RES_UINT_PV_MAJOR,RES_UINT_PV_MINOR,RES_UINT_PV_REVISION,RES_UINT_PV_BUILD + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", RES_STR_COMPANY_NAME + VALUE "FileDescription", "Client/Server Runtime Process\0" + VALUE "FileVersion", RES_STR_FILE_VERSION + VALUE "InternalName", "CSRSs and CSRSrv\0" + VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "CSRSs.exe and CSRSrv.dll\0" + VALUE "ProductName", RES_STR_PRODUCT_NAME + VALUE "ProductVersion", RES_STR_PRODUCT_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + diff --git a/reactos/include/ddk/iotypes.h b/reactos/include/ddk/iotypes.h index c8f9f7e8222..fa5e4be5c26 100644 --- a/reactos/include/ddk/iotypes.h +++ b/reactos/include/ddk/iotypes.h @@ -1,4 +1,4 @@ -/* $Id: iotypes.h,v 1.14 2000/03/26 19:38:13 ea Exp $ +/* $Id: iotypes.h,v 1.15 2000/03/26 22:00:06 dwelch Exp $ * */ @@ -165,6 +165,18 @@ typedef struct _IO_STACK_LOCATION FILE_INFORMATION_CLASS FileInformationClass; ULONG FileIndex; } QueryDirectory; + struct + { + ULONG FileAttributes; + ULONG OpenMode; + ULONG PipeType; + ULONG PipeRead; + ULONG PipeWait; + ULONG MaxInstances; + ULONG InBufferSize; + ULONG OutBufferSize; + LARGE_INTEGER Timeout; + } CreateNamedPipe; } Parameters; PIO_COMPLETION_ROUTINE CompletionRoutine; diff --git a/reactos/include/ddk/zw.h b/reactos/include/ddk/zw.h index 3214a590a5a..e08ad314685 100644 --- a/reactos/include/ddk/zw.h +++ b/reactos/include/ddk/zw.h @@ -1,5 +1,5 @@ -/* $Id: zw.h,v 1.26 2000/03/22 18:35:45 dwelch Exp $ +/* $Id: zw.h,v 1.27 2000/03/26 22:00:06 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -17,9 +17,11 @@ #ifndef __DDK_ZW_H #define __DDK_ZW_H +#include #define LCID ULONG -#define SECURITY_INFORMATION ULONG +//#define SECURITY_INFORMATION ULONG +//typedef ULONG SECURITY_INFORMATION; /* diff --git a/reactos/include/security.h b/reactos/include/security.h index 7ab0ca808dc..e42b8a97d50 100644 --- a/reactos/include/security.h +++ b/reactos/include/security.h @@ -1,6 +1,8 @@ #ifndef __INCLUDE_SECURITY_H #define __INCLUDE_SECURITY_H +typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION; + typedef enum _TOKEN_INFORMATION_CLASS { TokenUser = 1, TokenGroups, diff --git a/reactos/include/services/services.h b/reactos/include/services/services.h new file mode 100644 index 00000000000..c98d5a5be87 --- /dev/null +++ b/reactos/include/services/services.h @@ -0,0 +1,35 @@ +#ifndef __INCLUDE_SERVICES_SERVICES_H +#define __INCLUDE_SERVICES_SERVICES_H + +#define SCM_OPEN_MANAGER (1) +#define SCM_LOCK_MANAGER (10) +#define SCM_UNLOCK_MANAGER (11) + +#define SCM_CREATE_SERVICE (2) +#define SCM_OPEN_SERVICE (3) +#define SCM_CHANGE_CONFIG_SERVICE (4) +#define SCM_CONTROL_SERVICE (5) +#define SCM_DELETE_SERVICE (6) +#define SCM_SERVICES_STATUS (7) +#define SCM_GET_DISPLAY_NAME_SERVICE (8) +#define SCM_GET_KEY_NAME_SERVICE (9) +#define SCM_QUERY_CONFIG_SERVICE (12) +#define SCM_QUERY_LOCK_STATUS_SERVICE (13) +#define SCM_QUERY_STATUS_SERVICE (14) +#define SCM_START_SERVICE (15) + +#define SCM_REGISTER_CHANDLER (16) +#define SCM_SET_STATUS_SERVICE (17) +#define SCM_START_CDISPATCHER (18) + +typedef struct +{ + ULONG Type; +} SCM_API_REQUEST; + +typedef struct +{ + ULONG Status; +} SCM_API_REPLY; + +#endif /* __INCLUDE_SERVICES_SERVICES_H */ diff --git a/reactos/include/structs.h b/reactos/include/structs.h index 649df4de395..e7d73dc3320 100644 --- a/reactos/include/structs.h +++ b/reactos/include/structs.h @@ -3769,9 +3769,7 @@ typedef struct _SECURITY_ATTRIBUTES { LPVOID lpSecurityDescriptor; WINBOOL bInheritHandle; } SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; - -typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION; - + typedef struct _selchange { NMHDR nmhdr; CHARRANGE chrg; diff --git a/reactos/lib/advapi32/makefile b/reactos/lib/advapi32/makefile index 2a936e4bd8d..9ae8090566f 100644 --- a/reactos/lib/advapi32/makefile +++ b/reactos/lib/advapi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.10 1999/11/07 08:03:24 ea Exp $ +# $Id: makefile,v 1.11 2000/03/26 22:00:07 dwelch Exp $ # # Makefile for ReactOS advapi32.dll # @@ -25,7 +25,7 @@ REGISTRY_OBJECTS = reg/reg.o SECURITY_OBJECTS = sec/lsa.o sec/sec.o sec/ac.o -SERVICE_OBJECTS = service/scm.o +SERVICE_OBJECTS = service/scm.o service/sctrl.o service/undoc.o TOKEN_OBJECTS = token/token.o diff --git a/reactos/lib/advapi32/service/scm.c b/reactos/lib/advapi32/service/scm.c index 85d4695cc02..03b715780ab 100644 --- a/reactos/lib/advapi32/service/scm.c +++ b/reactos/lib/advapi32/service/scm.c @@ -1,4 +1,4 @@ -/* $Id: scm.c,v 1.4 1999/11/07 08:03:25 ea Exp $ +/* $Id: scm.c,v 1.5 2000/03/26 22:00:07 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -9,7 +9,13 @@ * 19990413 EA created * 19990515 EA */ + +/* INCLUDES ******************************************************************/ + #include +#include + +/* FUNCTIONS *****************************************************************/ /********************************************************************** * ChangeServiceConfigA @@ -346,39 +352,6 @@ GetServiceKeyNameW( return FALSE; } - -/********************************************************************** - * I_ScSetServiceBitsA - * - * Undocumented - * - * Return value unknown. - */ -DWORD -STDCALL -I_ScSetServiceBitsA(VOID) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 1; -} - - -/********************************************************************** - * I_ScSetServiceBitsW - * - * Undocumented - * - * Return value unknown. - */ -DWORD -STDCALL -I_ScSetServiceBitsW(VOID) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 1; -} - - /********************************************************************** * LockServiceDatabase */ @@ -396,32 +369,76 @@ LockServiceDatabase( /********************************************************************** * OpenSCManagerA */ -SC_HANDLE -STDCALL -OpenSCManagerA( - LPCSTR lpMachineName, - LPCSTR lpDatabaseName, - DWORD dwDesiredAccess - ) +SC_HANDLE STDCALL OpenSCManagerA(LPCSTR lpMachineName, + LPCSTR lpDatabaseName, + DWORD dwDesiredAccess) { - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return INVALID_HANDLE_VALUE; + SC_HANDLE h; + UNICODE_STRING MachineNameW; + UNICODE_STRING DatabaseNameW; + ANSI_STRING MachineNameA; + ANSI_STRING DatabaseNameA; + + RtlInitAnsiString(&MachineNameA, lpMachineName); + RtlAnsiStringToUnicodeString(&MachineNameW, + &MachineNameA, + TRUE); + RtlInitAnsiString(&DatabaseNameA, lpDatabaseName); + RtlAnsiStringToUnicodeString(&DatabaseNameW, + &DatabaseNameA, + TRUE); + + h = OpenSCManagerW(MachineNameW.Buffer, + DatabaseNameW.Buffer, + dwDesiredAccess); + + RtlFreeHeap(GetProcessHeap(), + 0, + MachineNameW.Buffer); + RtlFreeHeap(GetProcessHeap(), + 0, + DatabaseNameW.Buffer); + + return(h); } /********************************************************************** * OpenSCManagerW */ -SC_HANDLE -STDCALL -OpenSCManagerW( - LPCWSTR lpMachineName, - LPCWSTR lpDatabaseName, - DWORD dwDesiredAccess - ) +SC_HANDLE STDCALL OpenSCManagerW(LPCWSTR lpMachineName, + LPCWSTR lpDatabaseName, + DWORD dwDesiredAccess) { - SetLastError (ERROR_CALL_NOT_IMPLEMENTED); - return INVALID_HANDLE_VALUE; + HANDLE h; + + if (lpMachineName == NULL || + wcslen(lpMachineName) == 0) + { + if (lpDatabaseName != NULL && + wcscmp(lpDatabaseName, SERVICES_ACTIVE_DATABASEW) != 0) + { + return(NULL); + } + + h = CreateFile(L"\\\\.\\pipe\ntsrvctrl", + dwDesiredAccess, + 0, + NULL, + OPEN_EXISTING, + 0, + NULL); + if (h == INVALID_HANDLE_VALUE) + { + return(NULL); + } + + return(h); + } + else + { + return(NULL); + } } @@ -606,79 +623,6 @@ QueryServiceStatusEx(VOID) } -/********************************************************************** - * RegisterServiceCtrlHandlerA - */ -SERVICE_STATUS_HANDLE -STDCALL -RegisterServiceCtrlHandlerA( - LPCSTR lpServiceName, - LPHANDLER_FUNCTION lpHandlerProc - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -/********************************************************************** - * RegisterServiceCtrlHandlerW - */ -SERVICE_STATUS_HANDLE -STDCALL -RegisterServiceCtrlHandlerW( - LPCWSTR lpServiceName, - LPHANDLER_FUNCTION lpHandlerProc - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -/********************************************************************** - * SetServiceBits - */ -BOOL -STDCALL -SetServiceBits(VOID) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 1; -} - - -/********************************************************************** - * SetServiceObjectSecurity - */ -BOOL -STDCALL -SetServiceObjectSecurity( - SC_HANDLE hService, - SECURITY_INFORMATION dwSecurityInformation, - PSECURITY_DESCRIPTOR lpSecurityDescriptor - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -/********************************************************************** - * SetServiceStatus - */ -BOOL -STDCALL -SetServiceStatus( - SERVICE_STATUS_HANDLE hServiceStatus, - LPSERVICE_STATUS lpServiceStatus - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - /********************************************************************** * StartServiceA */ @@ -695,32 +639,6 @@ StartServiceA( } -/********************************************************************** - * StartServiceCtrlDispatcherA - */ -BOOL -STDCALL -StartServiceCtrlDispatcherA( - LPSERVICE_TABLE_ENTRYA lpServiceStartTable - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -/********************************************************************** - * StartServiceCtrlDispatcherW - */ -BOOL -STDCALL -StartServiceCtrlDispatcherW( - LPSERVICE_TABLE_ENTRYW lpServiceStartTable - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} /********************************************************************** diff --git a/reactos/lib/advapi32/service/sctrl.c b/reactos/lib/advapi32/service/sctrl.c new file mode 100644 index 00000000000..84cc0f4eeac --- /dev/null +++ b/reactos/lib/advapi32/service/sctrl.c @@ -0,0 +1,236 @@ +/* $Id: sctrl.c,v 1.1 2000/03/26 22:00:07 dwelch Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/advapi32/service/sctrl.c + * PURPOSE: Service control manager functions + * PROGRAMMER: Emanuele Aliberti + * UPDATE HISTORY: + * 19990413 EA created + * 19990515 EA + */ + +/* INCLUDES ******************************************************************/ + +#include +#include + +/* TYPES *********************************************************************/ + +typedef struct +{ + DWORD ThreadId; +} ACTIVE_SERVICE, *PACTIVE_SERVICE; + +/* GLOBALS *******************************************************************/ + +static ULONG ActiveServiceCount; +static PACTIVE_SERVICE ActiveServices; +static PHANDLE ActiveServicesThreadHandles; + +/* FUNCTIONS *****************************************************************/ + +/********************************************************************** + * RegisterServiceCtrlHandlerA + */ +SERVICE_STATUS_HANDLE STDCALL RegisterServiceCtrlHandlerA( + LPCSTR lpServiceName, + LPHANDLER_FUNCTION lpHandlerProc) +{ + + ANSI_STRING ServiceNameA; + UNICODE_STRING ServiceNameU; + SERVICE_STATUS_HANDLE SHandle; + + RtlInitAnsiString(&ServiceNameA, (LPSTR)lpServiceName); + RtlAnsiStringToUnicodeString(&ServiceNameU, &ServiceNameA, TRUE); + + SHandle = RegisterServiceCtrlHandlerW(ServiceNameU.Buffer, + lpHandlerProc); + + RtlFreeHeap(RtlGetProcessHeap(), 0, ServiceNameU.Buffer); + + return(SHandle); +} + + +/********************************************************************** + * RegisterServiceCtrlHandlerW + */ +SERVICE_STATUS_HANDLE STDCALL RegisterServiceCtrlHandlerW( + LPCWSTR lpServiceName, + LPHANDLER_FUNCTION lpHandlerProc) +{ + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return 0; +} + + +/********************************************************************** + * SetServiceBits + */ +BOOL STDCALL SetServiceBits(SERVICE_STATUS_HANDLE hServiceStatus, + DWORD dwServiceBits, + BOOL bSetBitsOn, + BOOL bUpdateImmediately) +{ + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return(FALSE); +} + + +/********************************************************************** + * SetServiceObjectSecurity + */ +WINBOOL +STDCALL +SetServiceObjectSecurity( + SC_HANDLE hService, + SECURITY_INFORMATION dwSecurityInformation, + PSECURITY_DESCRIPTOR lpSecurityDescriptor + ) +{ + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + + +/********************************************************************** + * SetServiceStatus + */ +BOOL +STDCALL +SetServiceStatus( + SERVICE_STATUS_HANDLE hServiceStatus, + LPSERVICE_STATUS lpServiceStatus + ) +{ + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +/********************************************************************** + * StartServiceCtrlDispatcherA + */ +BOOL STDCALL StartServiceCtrlDispatcherA( + LPSERVICE_TABLE_ENTRYA lpServiceStartTable) +{ + LPSERVICE_TABLE_ENTRYW ServiceStartTableW; + ANSI_STRING ServiceNameA; + UNICODE_STRING ServiceNameW; + ULONG i; + ULONG Count; + BOOL b; + + i = 0; + while (lpServiceStartTable[i].lpServiceProc != NULL) + { + i++; + } + Count = i; + + ServiceStartTableW = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(SERVICE_TABLE_ENTRYW) * Count); + for (i = 0; i < Count; i++) + { + RtlInitAnsiString(&ServiceNameA, + lpServiceStartTable[i].lpServiceName); + RtlAnsiStringToUnicodeString(&ServiceNameW, + &ServiceNameA, + TRUE); + ServiceStartTableW[i].lpServiceName = ServiceNameW.Buffer; + ServiceStartTableW[i].lpServiceProc = + lpServiceStartTable[i].lpServiceProc; + } + + b = StartServiceCtrlDispatcherW(ServiceStartTableW); + + for (i = 0; i < Count; i++) + { + RtlFreeHeap(RtlGetProcessHeap(), + 0, + ServiceStartTableW[i].lpServiceName); + } + RtlFreeHeap(RtlGetProcessHeap(), + 0, + ServiceStartTableW); + + return(b); +} + + +/********************************************************************** + * StartServiceCtrlDispatcherW + */ +BOOL STDCALL StartServiceCtrlDispatcherW( + LPSERVICE_TABLE_ENTRYW lpServiceStartTable) +{ + ULONG i; + HANDLE h; + DWORD Tid; + DWORD r; + + i = 0; + while (lpServiceStartTable[i].lpServiceProc != NULL) + { + i++; + } + + ActiveServiceCount = i; + ActiveServices = RtlAllocateHeap(GetProcessHeap(), + HEAP_ZERO_MEMORY, + ActiveServiceCount * + sizeof(ACTIVE_SERVICE)); + ActiveServicesThreadHandles = RtlAllocateHeap(GetProcessHeap(), + HEAP_ZERO_MEMORY, + (ActiveServiceCount + 1) * + sizeof(HANDLE)); + + for (i = 0; i 0) + { + r = WaitForMultipleObjects(ActiveServiceCount + 1, + ActiveServicesThreadHandles, + FALSE, + INFINITE); + if (r == WAIT_OBJECT_0) + { + /* Received message from the scm */ + } + else if (r > WAIT_OBJECT_0 && + r < (WAIT_OBJECT_0 + ActiveServiceCount)) + { + /* A service died */ + + ActiveServiceCount--; + ActiveServicesThreadHandles[r - WAIT_OBJECT_0 - 1] = + ActiveServicesThreadHandles[ActiveServiceCount + 1]; + memcpy(&ActiveServices[r - WAIT_OBJECT_0 - 2], + &ActiveServices[ActiveServiceCount], + sizeof(ACTIVE_SERVICE)); + } + else + { + /* Bail */ + } + } + return(TRUE); +} + + diff --git a/reactos/lib/advapi32/service/undoc.c b/reactos/lib/advapi32/service/undoc.c new file mode 100644 index 00000000000..e60c210c2c0 --- /dev/null +++ b/reactos/lib/advapi32/service/undoc.c @@ -0,0 +1,50 @@ +/* $Id: undoc.c,v 1.1 2000/03/26 22:00:07 dwelch Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/advapi32/service/undoc.c + * PURPOSE: Undocumented service functions + * PROGRAMMER: Emanuele Aliberti + * UPDATE HISTORY: + * 19990413 EA created + * 19990515 EA + */ + +/* INCLUDES ******************************************************************/ + +#include + +/* FUNCTIONS *****************************************************************/ + +/********************************************************************** + * I_ScSetServiceBitsA + * + * Undocumented + * + * Return value unknown. + */ +DWORD +STDCALL +I_ScSetServiceBitsA(VOID) +{ + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return 1; +} + + +/********************************************************************** + * I_ScSetServiceBitsW + * + * Undocumented + * + * Return value unknown. + */ +DWORD +STDCALL +I_ScSetServiceBitsW(VOID) +{ + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return 1; +} + + diff --git a/reactos/lib/kernel32/file/rw.c b/reactos/lib/kernel32/file/rw.c index 5516e660cf1..65f8097f7ac 100644 --- a/reactos/lib/kernel32/file/rw.c +++ b/reactos/lib/kernel32/file/rw.c @@ -1,4 +1,4 @@ -/* $Id: rw.c,v 1.9 2000/03/22 18:35:47 dwelch Exp $ +/* $Id: rw.c,v 1.10 2000/03/26 22:00:07 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -100,6 +100,15 @@ WINBOOL STDCALL ReadFile(HANDLE hFile, PIO_STATUS_BLOCK IoStatusBlock; PLARGE_INTEGER ptrOffset; + if (IsConsoleHandle(hFile)) + { + return(ReadConsoleA(hFile, + lpBuffer, + nNumberOfBytesToRead, + lpNumberOfBytesRead, + NULL)); + } + if (lpOverLapped != NULL) { Offset.u.LowPart = lpOverLapped->Offset; @@ -138,13 +147,18 @@ WINBOOL STDCALL ReadFile(HANDLE hFile, return(TRUE); } -VOID ApcRoutine(PVOID ApcContext, struct _IO_STATUS_BLOCK* IoStatusBlock, ULONG NumberOfBytesTransfered) +VOID ApcRoutine(PVOID ApcContext, + struct _IO_STATUS_BLOCK* IoStatusBlock, + ULONG NumberOfBytesTransfered) { - DWORD dwErrorCode; - LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine = (LPOVERLAPPED_COMPLETION_ROUTINE)ApcContext; - - dwErrorCode = RtlNtStatusToDosError( IoStatusBlock->Status); - lpCompletionRoutine( dwErrorCode, NumberOfBytesTransfered, (LPOVERLAPPED)IoStatusBlock ); + DWORD dwErrorCode; + LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine = + (LPOVERLAPPED_COMPLETION_ROUTINE)ApcContext; + + dwErrorCode = RtlNtStatusToDosError( IoStatusBlock->Status); + lpCompletionRoutine(dwErrorCode, + NumberOfBytesTransfered, + (LPOVERLAPPED)IoStatusBlock); } diff --git a/reactos/lib/kernel32/misc/console.c b/reactos/lib/kernel32/misc/console.c index 18f4c7d6287..468564ecffc 100644 --- a/reactos/lib/kernel32/misc/console.c +++ b/reactos/lib/kernel32/misc/console.c @@ -138,6 +138,10 @@ WINBOOL STDCALL WriteConsoleA(HANDLE hConsoleOutput, return(FALSE); } + HeapFree(GetProcessHeap(), + 0, + Request); + if (lpNumberOfCharsWritten != NULL) { *lpNumberOfCharsWritten = @@ -193,6 +197,10 @@ WINBOOL STDCALL ReadConsoleA(HANDLE hConsoleInput, Reply->Data.ReadConsoleReply.Buffer, Reply->Data.ReadConsoleReply.NrCharactersRead); + HeapFree(GetProcessHeap(), + 0, + Reply); + return(TRUE); } diff --git a/reactos/lib/rpcrt4/midl/Makefile b/reactos/lib/rpcrt4/midl/Makefile new file mode 100644 index 00000000000..ad5cf6eec67 --- /dev/null +++ b/reactos/lib/rpcrt4/midl/Makefile @@ -0,0 +1,53 @@ +# $Id: Makefile,v 1.1 2000/03/26 22:00:08 dwelch Exp $ +# +# ReactOS Operating System +# +TARGET=midl + +BASE_CFLAGS = -I../../include + +CFLAGS = $(CFLAGS) + +all: midl$(EXE_POSTFIX) + +idl.tab.o: idl.y + bison -t -v -d idl.y + $(NATIVE_CC) -c idl.tab.c -o idl.tab.o + +lex.yy.o: idl.l idl.tab.h + flex idl.l + $(NATIVE_CC) -c lex.yy.c -o lex.yy.o + +midl.o: midl.c midl.h idl.tab.h + $(NATIVE_CC) -c midl.c -o midl.o + +option.o: option.c midl.h idl.tab.h + $(NATIVE_CC) -c option.c -o option.o + +interface.o: interface.c midl.h idl.tab.h + $(NATIVE_CC) -c interface.c -o interface.o + +types.o: types.c midl.h idl.tab.h types.h + $(NATIVE_CC) -c types.c -o types.o + +midl$(EXE_POSTFIX): idl.tab.o lex.yy.o midl.o option.o interface.o types.o + $(NATIVE_CC) midl.o idl.tab.o lex.yy.o option.o interface.o -lfl \ + types.o -o midl$(EXE_POSTFIX) + +include ../../../rules.mak + + + + + + + + + + + + + + + + diff --git a/reactos/lib/rpcrt4/midl/hello.idl b/reactos/lib/rpcrt4/midl/hello.idl new file mode 100644 index 00000000000..89941827e37 --- /dev/null +++ b/reactos/lib/rpcrt4/midl/hello.idl @@ -0,0 +1,10 @@ +[ +uuid(b574a080-aceb-11d3-95f9-aa43ded19f71), +version(1.0), +pointer_default(unique) +] +interface hello +{ + void HelloProc([in] int pszString); + void Shutdown(void); +} diff --git a/reactos/lib/rpcrt4/midl/idl.l b/reactos/lib/rpcrt4/midl/idl.l new file mode 100644 index 00000000000..3815a7ccaf4 --- /dev/null +++ b/reactos/lib/rpcrt4/midl/idl.l @@ -0,0 +1,88 @@ +%{ +#include "midl.h" +#include "idl.tab.h" +#include + +int lineno = 1; +void yyerror(char* s); +char* current_file; +int nr_errors = 0; + +#define TOK(n) { yylval.token = n; return n; } + +%} + +DIGIT [0-9] +ID [a-zA-Z][a-zA-Z0-9]* +UUID [a-z0-9]* + +%% + +uuid { TOK(UUID_KEYWORD); } +version { TOK(VERSION_KEYWORD); } +pointer_default { TOK(POINTER_DEFAULT_KEYWORD); } +unique { TOK(UNIQUE_KEYWORD); } +interface { TOK(INTERFACE_KEYWORD); } +in { TOK(IN_KEYWORD); } +out { TOK(OUT_KEYWORD); } + +{ID} { int n; + if ((n = token_to_type(yytext)) != 0) + { + yylval.tval = n; + return(TYPE_KEYWORD); + } + else + { + yylval.id = strdup(yytext); + return(ID_TOKEN); + } + } + +{DIGIT}+ { yylval.number = atoi(yytext); + return(NUMBER_TOKEN); } + +{DIGIT}+"."{DIGIT}+ { char* ebuf; + yylval.version.major = strtoul(yytext, &ebuf, 0); + yylval.version.minor = strtoul(ebuf + 1, NULL, 0); + return(VERSION_TOKEN); } + +{UUID}+"-"{UUID}+"-"{UUID}+"-"{UUID}+"-"{UUID}+ { yylval.uuid = strdup(yytext); + return(UUID_TOKEN); } + +";" { TOK(LINE_TERMINATOR); } + +"(" { TOK(LEFT_BRACKET); } + +")" { TOK(RIGHT_BRACKET); } + +"," { TOK(COMMA); } + +"{" { TOK(LCURLY_BRACKET); } + +"}" { TOK(RCURLY_BRACKET); } + +"[" { TOK(LSQBRACKET); } + +"]" { TOK(RSQBRACKET); } + +\n lineno++; + +[ \t\r]+ ; + +. yyerror("invalid character"); + +%% + +void yyerror(char* s) +{ + nr_errors++; + printf("%s:%d: %s at %s\n", current_file, lineno, s, yytext); +} + +void yyerror1(char* s) +{ + nr_errors++; + printf("%s:%d: %s\n", current_file, lineno, s); +} + diff --git a/reactos/lib/rpcrt4/midl/idl.y b/reactos/lib/rpcrt4/midl/idl.y new file mode 100644 index 00000000000..d7bed8e8d3f --- /dev/null +++ b/reactos/lib/rpcrt4/midl/idl.y @@ -0,0 +1,91 @@ +%{ +#include "midl.h" +%} + +%union { +int tval; +int token; +char* id; +int number; +char* uuid; +char operator; +struct +{ +int minor; +int major; +} version; +} + +%token ID_TOKEN +%token UUID_TOKEN +%token NUMBER_TOKEN +%token VERSION_TOKEN + +%token UUID_KEYWORD +%token VERSION_KEYWORD +%token POINTER_DEFAULT_KEYWORD +%token UNIQUE_KEYWORD +%token INTERFACE_KEYWORD + +%token IN_KEYWORD, OUT_KEYWORD, + +%token LSQBRACKET, RSQBRACKET, LBRACKET, RBRACKET +%token LCURLY_BRACKET, RCURLY_BRACKET, LINE_TERMINATOR, COMMA +%token LEFT_BRACKET, RIGHT_BRACKET + +%token TYPE_KEYWORD + +%type type + +%% + +idl_file: + LSQBRACKET options RSQBRACKET interface + ; + +options: + option + | option COMMA options + ; + +option: + UUID_KEYWORD LEFT_BRACKET UUID_TOKEN RIGHT_BRACKET + { set_uuid($3); } + | VERSION_KEYWORD LEFT_BRACKET VERSION_TOKEN RIGHT_BRACKET + { set_version($3.major, $3.minor); } + | POINTER_DEFAULT_KEYWORD LEFT_BRACKET UNIQUE_KEYWORD RIGHT_BRACKET + { set_pointer_default($3); } + ; + +interface: { start_interface(); } + INTERFACE_KEYWORD ID_TOKEN LCURLY_BRACKET functions RCURLY_BRACKET + { end_interface($3); } + +functions: + | function LINE_TERMINATOR functions + ; + +function: { start_function(); } + type ID_TOKEN LEFT_BRACKET argument_list RIGHT_BRACKET + { end_function($2, $3); } + ; + +argument_list: + | TYPE_KEYWORD { if ($1 != VOID_TYPE) + { + yyerror("parameter name ommitted"); + } + } + | argument + | argument COMMA argument_list + ; + +argument: + LSQBRACKET direction RSQBRACKET type ID_TOKEN { add_argument($4, $5); } + ; + +type: TYPE_KEYWORD; + +direction: + IN_KEYWORD + ; diff --git a/reactos/lib/rpcrt4/midl/interface.c b/reactos/lib/rpcrt4/midl/interface.c new file mode 100644 index 00000000000..21eee4500ea --- /dev/null +++ b/reactos/lib/rpcrt4/midl/interface.c @@ -0,0 +1,74 @@ +#include +#include +#include + +#include "midl.h" +#include "idl.tab.h" + +static interface* current_interface; +static function* current_function; + +void add_argument(int type, char* name) +{ + argument* arg; + + arg = malloc(sizeof(argument)); + + arg->type = type; + arg->name = strdup(name); + + arg->next = current_function->arguments; + current_function->arguments = arg; +} + +void start_interface(void) +{ + current_interface = (interface *)malloc(sizeof(interface)); +} + +void start_function(void) +{ + function* f; + + f = (function *)malloc(sizeof(function)); + + f->arguments = NULL; + + f->next = current_interface->function_list; + current_interface->function_list = f; + current_function = f; +} + +void end_function(int rtype, char* name) +{ + current_function->return_type = rtype; + current_function->name = strdup(name); +} + +void end_interface(char* name) +{ + function* cur; + argument* a; + + printf("interface_name: %s\n", name); + + current_interface->name = strdup(name); + cur = current_interface->function_list; + while (cur != NULL) + { + print_type(cur->return_type); + printf(" function_name: %s (\n", cur->name, cur); + + a = cur->arguments; + while (a != NULL) + { + printf("\t"); + print_type(a->type); + printf(" %s\n", a->name); + a = a->next; + } + printf(")\n"); + + cur = cur->next; + } +} diff --git a/reactos/lib/rpcrt4/midl/midl.c b/reactos/lib/rpcrt4/midl/midl.c new file mode 100644 index 00000000000..d105bc4d90c --- /dev/null +++ b/reactos/lib/rpcrt4/midl/midl.c @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include + +extern FILE* yyin; +extern int yyparse(void); +extern int yydebug; +extern int nr_errors; +extern char* current_file; + +int main(int argc, char* argv[]) +{ + int fd; + char* tempname; + int n, p, status; + char* args[9]; + + if (argc == 1) + { + printf("Not enough arguments\n"); + exit(1); + } + + tempname = tempnam(NULL, "midl"); + + args[0] = strdup("/usr/bin/gcc"); + args[1] = strdup("-x"); + args[2] = strdup("c"); + args[3] = strdup("-P"); + args[4] = strdup("-E"); + args[5] = strdup(argv[1]); + args[6] = strdup("-o"); + args[7] = strdup(tempname); + args[8] = NULL; + + if ((n = fork()) == 0) + { + execv("/usr/bin/gcc", args); + perror("gcc"); + exit(1); + } + else if (n == -1) + { + perror("midl"); + exit(1); + } + + p = waitpid(n, &status, WUNTRACED); + if (p == -1 || p == 0 || !WIFEXITED(status)) + { + perror("midl"); + exit(1); + } + if (WEXITSTATUS(status) != 0) + { + printf("midl: the preprocessor %s failed\n"); + exit(1); + } + +// yydebug = 1; + + yyin = fopen(tempname, "r+b"); + if (yyin == NULL) + { + perror(argv[1]); + exit(1); + } + + current_file = strdup(argv[1]); + + if (yyparse() != 0 || nr_errors > 0) + { + exit(1); + } + + unlink(tempname); +} diff --git a/reactos/lib/rpcrt4/midl/midl.h b/reactos/lib/rpcrt4/midl/midl.h new file mode 100644 index 00000000000..582a771d2c2 --- /dev/null +++ b/reactos/lib/rpcrt4/midl/midl.h @@ -0,0 +1,37 @@ +#ifndef __MIDL_H +#define __MIDL_H + +#include "types.h" + +typedef struct _argument +{ + int type; + char* name; + struct _argument* next; +} argument; + +typedef struct _function +{ + int return_type; + char* name; + argument* arguments; + struct _function* next; +} function; + +typedef struct +{ + char* name; + function* function_list; +} interface; + +void set_uuid(char* uuid); +void set_version(int major, int minor); +void set_pointer_default(int option); + +void start_interface(void); +void end_interface(char* name); +void start_function(void); +void end_function(int rtype, char* name); +void add_argument(int type, char* name); + +#endif __MIDL_H diff --git a/reactos/lib/rpcrt4/midl/option.c b/reactos/lib/rpcrt4/midl/option.c new file mode 100644 index 00000000000..a2427cbf067 --- /dev/null +++ b/reactos/lib/rpcrt4/midl/option.c @@ -0,0 +1,16 @@ +#include + +#include "midl.h" +#include "idl.tab.h" + +void set_uuid(char* uuid) +{ +} + +void set_version(int major, int minor) +{ +} + +void set_pointer_default(int option) +{ +} diff --git a/reactos/lib/rpcrt4/midl/types.c b/reactos/lib/rpcrt4/midl/types.c new file mode 100644 index 00000000000..e69cf4152e7 --- /dev/null +++ b/reactos/lib/rpcrt4/midl/types.c @@ -0,0 +1,62 @@ +#include +#include +#include + +#include "midl.h" + +typedef struct +{ + char* name; + unsigned int value; + unsigned int default_sign; +} type; + +static type types[] = { + {"boolean", BOOLEAN_TYPE, UNSIGNED_TYPE_OPTION}, + {"byte", BYTE_TYPE, 0}, + {"char", CHAR_TYPE, UNSIGNED_TYPE_OPTION}, + {"double", DOUBLE_TYPE, 0}, + {"error_status_t", ERROR_STATUS_TYPE, UNSIGNED_TYPE_OPTION}, + {"float", FLOAT_TYPE, 0}, + {"handle_t", HANDLE_TYPE, 0}, + {"hyper", HYPER_TYPE, SIGNED_TYPE_OPTION}, + {"int", INT_TYPE, SIGNED_TYPE_OPTION}, + {"__int32", INT32_TYPE, SIGNED_TYPE_OPTION}, + {"__int3264", INT32OR64_TYPE, SIGNED_TYPE_OPTION}, + {"__int64", INT64_TYPE, SIGNED_TYPE_OPTION}, + {"long", LONG_TYPE, SIGNED_TYPE_OPTION}, + {"short", SHORT_TYPE, SIGNED_TYPE_OPTION}, + {"small", SMALL_TYPE, SIGNED_TYPE_OPTION}, + {"void", VOID_TYPE, 0}, + {"wchar_t", WCHAR_TYPE, UNSIGNED_TYPE_OPTION}, + {NULL, 0, 0} + }; + +void print_type(int tval) +{ + int i; + + for (i = 0; types[i].name != NULL; i++) + { + if (tval == types[i].value) + { + printf("%s", types[i].name); + return; + } + } + printf("unknown type"); +} + +int token_to_type(char* token) +{ + int i; + + for (i = 0; types[i].name != NULL; i++) + { + if (strcmp(types[i].name, token) == 0) + { + return(types[i].value); + } + } + return(0); +} diff --git a/reactos/lib/rpcrt4/midl/types.h b/reactos/lib/rpcrt4/midl/types.h new file mode 100644 index 00000000000..69eb623a7c0 --- /dev/null +++ b/reactos/lib/rpcrt4/midl/types.h @@ -0,0 +1,33 @@ +#ifndef __TYPES_H +#define __TYPES_H + +#define BOOLEAN_TYPE (0x100) +#define BYTE_TYPE (0x200) +#define CHAR_TYPE (0x400) +#define DOUBLE_TYPE (0x800) +#define ERROR_STATUS_TYPE (0x1000) +#define FLOAT_TYPE (0x2000) +#define HANDLE_TYPE (0x4000) +#define HYPER_TYPE (0x8000) +#define INT_TYPE (0x10000) +#define INT32_TYPE (0x20000) +#define INT32OR64_TYPE (0x40000) +#define INT64_TYPE (0x80000) +#define LONG_TYPE (0x100000) +#define SHORT_TYPE (0x200000) +#define SMALL_TYPE (0x400000) +#define VOID_TYPE (0x800000) +#define WCHAR_TYPE (0x1000000) + +#define UNSIGNED_TYPE_OPTION (0x1) +#define SIGNED_TYPE_OPTION (0x2) +#define POINTER_TYPE_OPTION (0x4) + +#define IN_TYPE_OPTION (0x8) +#define OUT_TYPE_OPTION (0x10) +#define STRING_TYPE_OPTION (0x20) + +int token_to_type(char* token); +void print_type(int tval); + +#endif diff --git a/reactos/ntoskrnl/io/npipe.c b/reactos/ntoskrnl/io/npipe.c index ea92ef26f3c..2326f4ba19c 100644 --- a/reactos/ntoskrnl/io/npipe.c +++ b/reactos/ntoskrnl/io/npipe.c @@ -1,8 +1,8 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel - * FILE: ntoskrnl/ke/bug.c - * PURPOSE: Graceful system shutdown if a bug is detected + * FILE: ntoskrnl/io/npipe.c + * PURPOSE: Named pipe helper function * PROGRAMMER: David Welch (welch@mcmail.com) * UPDATE HISTORY: * Created 22/05/98 @@ -11,14 +11,14 @@ /* INCLUDES *****************************************************************/ #include +#include +#include #include /* FUNCTIONS *****************************************************************/ -NTSTATUS -STDCALL -NtCreateNamedPipeFile ( +NTSTATUS STDCALL NtCreateNamedPipeFile( OUT PHANDLE NamedPipeFileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, @@ -32,8 +32,93 @@ NtCreateNamedPipeFile ( IN ULONG MaxInstances, IN ULONG InBufferSize, IN ULONG OutBufferSize, - IN PLARGE_INTEGER TimeOut - ) + IN PLARGE_INTEGER TimeOut) { - UNIMPLEMENTED; + PFILE_OBJECT FileObject; + NTSTATUS Status; + PIRP Irp; + KEVENT Event; + PIO_STACK_LOCATION StackLoc; + + DPRINT1("NtCreateNamedPipeFile(FileHandle %x, DesiredAccess %x, " + "ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %S)\n", + NamedPipeFileHandle,DesiredAccess,ObjectAttributes, + ObjectAttributes->ObjectName->Buffer); + + assert_irql(PASSIVE_LEVEL); + + *NamedPipeFileHandle=0; + + FileObject = ObCreateObject(NamedPipeFileHandle, + DesiredAccess, + ObjectAttributes, + IoFileType); + if (FileObject == NULL) + { + return(STATUS_UNSUCCESSFUL); + } + + if (OpenMode & FILE_SYNCHRONOUS_IO_ALERT) + { + FileObject->Flags = FileObject->Flags | FO_ALERTABLE_IO; + FileObject->Flags = FileObject->Flags | FO_SYNCHRONOUS_IO; + } + if (OpenMode & FILE_SYNCHRONOUS_IO_NONALERT) + { + FileObject->Flags = FileObject->Flags | FO_SYNCHRONOUS_IO; + } + + KeInitializeEvent(&Event, NotificationEvent, FALSE); + + DPRINT("FileObject %x\n", FileObject); + DPRINT("FileObject->DeviceObject %x\n", FileObject->DeviceObject); + Irp = IoAllocateIrp(FileObject->DeviceObject->StackSize, FALSE); + if (Irp==NULL) + { + return(STATUS_UNSUCCESSFUL); + } + + StackLoc = IoGetNextIrpStackLocation(Irp); + StackLoc->MajorFunction = IRP_MJ_CREATE_NAMED_PIPE; + StackLoc->MinorFunction = 0; + StackLoc->Flags = 0; + StackLoc->Control = 0; + StackLoc->DeviceObject = FileObject->DeviceObject; + StackLoc->FileObject = FileObject; + StackLoc->Parameters.CreateNamedPipe.FileAttributes = FileAttributes; + StackLoc->Parameters.CreateNamedPipe.OpenMode = OpenMode; + StackLoc->Parameters.CreateNamedPipe.PipeType = PipeType; + StackLoc->Parameters.CreateNamedPipe.PipeRead = PipeRead; + StackLoc->Parameters.CreateNamedPipe.PipeWait = PipeWait; + StackLoc->Parameters.CreateNamedPipe.MaxInstances = MaxInstances; + StackLoc->Parameters.CreateNamedPipe.InBufferSize = InBufferSize; + StackLoc->Parameters.CreateNamedPipe.OutBufferSize = OutBufferSize; + if (TimeOut != NULL) + { + StackLoc->Parameters.CreateNamedPipe.Timeout = *TimeOut; + } + else + { + StackLoc->Parameters.CreateNamedPipe.Timeout.QuadPart = 0; + } + + Status = IoCallDriver(FileObject->DeviceObject,Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL); + Status = IoStatusBlock->Status; + } + + if (!NT_SUCCESS(Status)) + { + DPRINT("Failing create request with status %x\n",Status); + ZwClose(*NamedPipeFileHandle); + (*NamedPipeFileHandle) = 0; + } + + assert_irql(PASSIVE_LEVEL); + DPRINT("Finished NtCreateFile() (*FileHandle) %x\n", + (*NamedPipeFileHandle)); + return(Status); + } diff --git a/reactos/ntoskrnl/io/symlink.c b/reactos/ntoskrnl/io/symlink.c index 4d706e5e779..1c8cde9a6ec 100644 --- a/reactos/ntoskrnl/io/symlink.c +++ b/reactos/ntoskrnl/io/symlink.c @@ -1,4 +1,4 @@ -/* $Id: symlink.c,v 1.11 2000/01/21 23:59:53 phreak Exp $ +/* $Id: symlink.c,v 1.12 2000/03/26 22:00:08 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -20,19 +20,15 @@ /* GLOBALS ******************************************************************/ -typedef -struct +typedef struct { CSHORT Type; CSHORT Size; UNICODE_STRING TargetName; - OBJECT_ATTRIBUTES Target; - + OBJECT_ATTRIBUTES Target; } SYMLNK_OBJECT, *PSYMLNK_OBJECT; - -POBJECT_TYPE -IoSymbolicLinkType = NULL; +POBJECT_TYPE IoSymbolicLinkType = NULL; /* FUNCTIONS *****************************************************************/ @@ -126,41 +122,28 @@ IopParseSymbolicLink ( * * REVISIONS */ -VOID -IoInitSymbolicLinkImplementation (VOID) +VOID IoInitSymbolicLinkImplementation (VOID) { - ANSI_STRING AnsiString; + IoSymbolicLinkType = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE)); - IoSymbolicLinkType = ExAllocatePool( - NonPagedPool, - sizeof (OBJECT_TYPE) - ); - - IoSymbolicLinkType->TotalObjects = 0; - IoSymbolicLinkType->TotalHandles = 0; - IoSymbolicLinkType->MaxObjects = ULONG_MAX; - IoSymbolicLinkType->MaxHandles = ULONG_MAX; - IoSymbolicLinkType->PagedPoolCharge = 0; - IoSymbolicLinkType->NonpagedPoolCharge = sizeof (SYMLNK_OBJECT); - IoSymbolicLinkType->Dump = NULL; - IoSymbolicLinkType->Open = NULL; - IoSymbolicLinkType->Close = NULL; - IoSymbolicLinkType->Delete = NULL; - IoSymbolicLinkType->Parse = IopParseSymbolicLink; - IoSymbolicLinkType->Security = NULL; - IoSymbolicLinkType->QueryName = NULL; - IoSymbolicLinkType->OkayToClose = NULL; - IoSymbolicLinkType->Create = IopCreateSymbolicLink; - - RtlInitAnsiString( - & AnsiString, - "Symbolic Link" - ); - RtlAnsiStringToUnicodeString( - & IoSymbolicLinkType->TypeName, - & AnsiString, - TRUE - ); + IoSymbolicLinkType->TotalObjects = 0; + IoSymbolicLinkType->TotalHandles = 0; + IoSymbolicLinkType->MaxObjects = ULONG_MAX; + IoSymbolicLinkType->MaxHandles = ULONG_MAX; + IoSymbolicLinkType->PagedPoolCharge = 0; + IoSymbolicLinkType->NonpagedPoolCharge = sizeof (SYMLNK_OBJECT); + IoSymbolicLinkType->Dump = NULL; + IoSymbolicLinkType->Open = NULL; + IoSymbolicLinkType->Close = NULL; + IoSymbolicLinkType->Delete = NULL; + IoSymbolicLinkType->Parse = IopParseSymbolicLink; + IoSymbolicLinkType->Security = NULL; + IoSymbolicLinkType->QueryName = NULL; + IoSymbolicLinkType->OkayToClose = NULL; + IoSymbolicLinkType->Create = IopCreateSymbolicLink; + + RtlInitUnicodeString(&IoSymbolicLinkType->TypeName, + L"SymbolicLink"); } diff --git a/reactos/ntoskrnl/ob/dirobj.c b/reactos/ntoskrnl/ob/dirobj.c index ea9ac745936..ddcec8e6c6a 100644 --- a/reactos/ntoskrnl/ob/dirobj.c +++ b/reactos/ntoskrnl/ob/dirobj.c @@ -1,4 +1,4 @@ -/* $Id: dirobj.c,v 1.7 2000/01/12 19:04:22 ekohl Exp $ +/* $Id: dirobj.c,v 1.8 2000/03/26 22:00:09 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -47,42 +47,34 @@ * NOTES * Undocumented. */ -NTSTATUS -STDCALL -NtOpenDirectoryObject ( - PHANDLE DirectoryHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes - ) +NTSTATUS STDCALL NtOpenDirectoryObject(PHANDLE DirectoryHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes) { - PVOID Object; - NTSTATUS Status; + PVOID Object; + NTSTATUS Status; - *DirectoryHandle = 0; - - Status = ObReferenceObjectByName( - ObjectAttributes->ObjectName, - ObjectAttributes->Attributes, - NULL, - DesiredAccess, - ObDirectoryType, - UserMode, - NULL, - & Object - ); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Status = ObCreateHandle( - PsGetCurrentProcess(), - Object, - DesiredAccess, - FALSE, - DirectoryHandle - ); - return STATUS_SUCCESS; + *DirectoryHandle = 0; + + Status = ObReferenceObjectByName(ObjectAttributes->ObjectName, + ObjectAttributes->Attributes, + NULL, + DesiredAccess, + ObDirectoryType, + UserMode, + NULL, + &Object); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + Status = ObCreateHandle(PsGetCurrentProcess(), + Object, + DesiredAccess, + FALSE, + DirectoryHandle); + return STATUS_SUCCESS; } @@ -122,134 +114,133 @@ NtOpenDirectoryObject ( * RETURN VALUE * Status. */ -NTSTATUS -STDCALL -NtQueryDirectoryObject ( - IN HANDLE DirObjHandle, - OUT POBJDIR_INFORMATION DirObjInformation, - IN ULONG BufferLength, - IN BOOLEAN GetNextIndex, - IN BOOLEAN IgnoreInputIndex, - IN OUT PULONG ObjectIndex, - OUT PULONG DataWritten OPTIONAL - ) +NTSTATUS STDCALL NtQueryDirectoryObject (IN HANDLE DirObjHandle, + OUT POBJDIR_INFORMATION + DirObjInformation, + IN ULONG BufferLength, + IN BOOLEAN GetNextIndex, + IN BOOLEAN IgnoreInputIndex, + IN OUT PULONG ObjectIndex, + OUT PULONG DataWritten OPTIONAL) { - PDIRECTORY_OBJECT dir = NULL; - ULONG EntriesToRead; - PLIST_ENTRY current_entry; - POBJECT_HEADER current; - ULONG i=0; - ULONG EntriesToSkip; - NTSTATUS Status; + PDIRECTORY_OBJECT dir = NULL; + PLIST_ENTRY current_entry; + POBJECT_HEADER current; + ULONG i = 0; + ULONG EntriesToSkip; + NTSTATUS Status; + ULONG SpaceRequired; + ULONG FirstFree; + + DPRINT("NtQueryDirectoryObject(DirObjHandle %x)\n", DirObjHandle); - - DPRINT( - "NtQueryDirectoryObject(DirObjHandle %x)\n", - DirObjHandle - ); - DPRINT( - "dir %x namespc_root %x\n", - dir, - HEADER_TO_BODY(&(namespc_root.hdr)) - ); - -// assert_irql(PASSIVE_LEVEL); - - Status = ObReferenceObjectByHandle( - DirObjHandle, - DIRECTORY_QUERY, - ObDirectoryType, - UserMode, - (PVOID *) & dir, - NULL - ); - if (Status != STATUS_SUCCESS) - { - return Status; - } - - EntriesToRead = BufferLength / sizeof (OBJDIR_INFORMATION); - *DataWritten = 0; - - DPRINT("EntriesToRead %d\n",EntriesToRead); - - current_entry = dir->head.Flink; - - /* - * Optionally, skip over some entries at the start of the directory - */ - if (!IgnoreInputIndex) - { - CHECKPOINT; - - EntriesToSkip = *ObjectIndex; - while ( (i < EntriesToSkip) && (current_entry != NULL)) - { - current_entry = current_entry->Flink; - } - } - - DPRINT("DirObjInformation %x\n",DirObjInformation); - - /* - * Read the maximum entries possible into the buffer - */ - while ( (i < EntriesToRead) && (current_entry != (&(dir->head)))) - { - current = CONTAINING_RECORD( - current_entry, - OBJECT_HEADER, - Entry - ); - DPRINT( - "Scanning %S\n", - current->Name.Buffer - ); - - DirObjInformation[i].ObjectName.Buffer = - ExAllocatePool( - NonPagedPool, - (current->Name.Length + 1) * 2 - ); - 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; - } + Status = ObReferenceObjectByHandle(DirObjHandle, + DIRECTORY_QUERY, + ObDirectoryType, + UserMode, + (PVOID*)&dir, + NULL); + if (!NT_SUCCESS(Status)) + { + return(Status); + } + + /* + * Optionally, skip over some entries at the start of the directory + */ + if (!IgnoreInputIndex) + { CHECKPOINT; - - /* - * Optionally, count the number of entries in the directory - */ - if (GetNextIndex) - { - *ObjectIndex = i; - } - else - { - while ( current_entry != (&(dir->head)) ) - { - current_entry = current_entry->Flink; - i++; - } - *ObjectIndex = i; - } - return STATUS_SUCCESS; + + EntriesToSkip = *ObjectIndex; + i = 0; + current_entry = dir->head.Flink; + + while ((i < EntriesToSkip) && (current_entry != &dir->head)) + { + current_entry = current_entry->Flink; + i++; + } + } + else + { + current_entry = dir->head.Flink; + i = 0; + } + + /* + * Check if we have reached the end of the directory + */ + if (current_entry != &dir->head) + { + *DataWritten = 0; + return(STATUS_NO_MORE_ENTRIES); + } + + /* + * Read the current entry into the buffer + */ + FirstFree = sizeof(OBJDIR_INFORMATION); + + current = CONTAINING_RECORD(current_entry, OBJECT_HEADER, Entry); + + SpaceRequired = (wcslen(current->Name.Buffer) + 1) * 2; + SpaceRequired = SpaceRequired + + ((wcslen(current->ObjectType->TypeName.Buffer) + 1) * 2); + SpaceRequired = SpaceRequired + sizeof(OBJDIR_INFORMATION); + + if (SpaceRequired <= BufferLength) + { + + DirObjInformation->ObjectName.Length = + current->Name.Length; + DirObjInformation->ObjectName.MaximumLength = + current->Name.Length; + DirObjInformation->ObjectName.Buffer = + (((PVOID)DirObjInformation) + FirstFree); + FirstFree = FirstFree + (wcslen(current->Name.Buffer + 1) * 2); + wcscpy(DirObjInformation->ObjectName.Buffer, + current->Name.Buffer); + + DirObjInformation->ObjectTypeName.Length = + current->ObjectType->TypeName.Length; + DirObjInformation->ObjectTypeName.MaximumLength = + current->ObjectType->TypeName.Length; + DirObjInformation->ObjectName.Buffer = + (((PVOID)DirObjInformation) + FirstFree); + FirstFree = FirstFree + + (wcslen(current->ObjectType->TypeName.Buffer + 1) * 2); + wcscpy(DirObjInformation->ObjectTypeName.Buffer, + current->ObjectType->TypeName.Buffer); + + *DataWritten = SpaceRequired; + Status = STATUS_SUCCESS; + } + else + { + Status = STATUS_BUFFER_TOO_SMALL; + } + + /* + * Store into ObjectIndex + */ + if (GetNextIndex) + { + *ObjectIndex = i + 1; + } + else + { + i = 0; + current_entry = dir->head.Flink; + while (current_entry != (&dir->head)) + { + current_entry = current_entry->Flink; + i++; + } + *ObjectIndex = i; + } + + return(STATUS_SUCCESS); } @@ -276,23 +267,23 @@ NtQueryDirectoryObject ( * RETURN VALUE * Status. */ -NTSTATUS -STDCALL -NtCreateDirectoryObject ( - PHANDLE DirectoryHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes - ) +NTSTATUS STDCALL NtCreateDirectoryObject (PHANDLE DirectoryHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes) { - PDIRECTORY_OBJECT dir; + PDIRECTORY_OBJECT dir; - dir = ObCreateObject( - DirectoryHandle, - DesiredAccess, - ObjectAttributes, - ObDirectoryType - ); - return STATUS_SUCCESS; + DPRINT("NtCreateDirectoryObject(DirectoryHandle %x, " + "DesiredAccess %x, ObjectAttributes %x, " + "ObjectAttributes->ObjectName %S)\n", + DirectoryHandle, DesiredAccess, ObjectAttributes, + ObjectAttributes->ObjectName); + + dir = ObCreateObject(DirectoryHandle, + DesiredAccess, + ObjectAttributes, + ObDirectoryType); + return(STATUS_SUCCESS); } /* EOF */ diff --git a/reactos/ntoskrnl/ob/handle.c b/reactos/ntoskrnl/ob/handle.c index 45f484f8f5d..a6c100846d8 100644 --- a/reactos/ntoskrnl/ob/handle.c +++ b/reactos/ntoskrnl/ob/handle.c @@ -1,4 +1,4 @@ -/* $Id: handle.c,v 1.18 2000/01/22 00:04:56 phreak Exp $ +/* $Id: handle.c,v 1.19 2000/03/26 22:00:09 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -47,7 +47,7 @@ static PHANDLE_REP ObpGetObjectByHandle(PHANDLE_TABLE HandleTable, HANDLE h) */ { PLIST_ENTRY current; - unsigned int handle = (((unsigned int)h) - 1) >> 3; + unsigned int handle = (((unsigned int)h) - 1) >> 2; unsigned int count=handle/HANDLE_BLOCK_ENTRIES; HANDLE_BLOCK* blk = NULL; unsigned int i; @@ -200,7 +200,7 @@ VOID ObCloseAllHandles(PEPROCESS Process) DPRINT("Deleting handle to %x\n", ObjectBody); } - ObReferenceObjectByPointer(ObjectBody, + ObReferenceObjectByPointer(ObjectBody, GENERIC_ALL, NULL, UserMode); @@ -216,7 +216,7 @@ VOID ObCloseAllHandles(PEPROCESS Process) Header->HandleCount); } - ObDereferenceObject(ObjectBody); + ObDereferenceObject(ObjectBody); KeAcquireSpinLock(&HandleTable->ListLock, &oldIrql); current_entry = &HandleTable->ListHead; break; @@ -409,7 +409,7 @@ NTSTATUS ObCreateHandle(PEPROCESS Process, blk->handles[i].GrantedAccess = GrantedAccess; blk->handles[i].Inherit = Inherit; KeReleaseSpinLock(&HandleTable->ListLock, oldlvl); - *HandleReturn = (HANDLE)((handle + i) << 3); + *HandleReturn = (HANDLE)((handle + i) << 2); return(STATUS_SUCCESS); } } @@ -429,7 +429,7 @@ NTSTATUS ObCreateHandle(PEPROCESS Process, new_blk->handles[0].ObjectBody = ObjectBody; new_blk->handles[0].GrantedAccess = GrantedAccess; new_blk->handles[0].Inherit = Inherit; - *HandleReturn = (HANDLE)(handle << 3); + *HandleReturn = (HANDLE)(handle << 2); return(STATUS_SUCCESS); } diff --git a/reactos/subsys/csrss/api/handle.c b/reactos/subsys/csrss/api/handle.c index 023c79ea44d..cfaddefe9b5 100644 --- a/reactos/subsys/csrss/api/handle.c +++ b/reactos/subsys/csrss/api/handle.c @@ -1,4 +1,4 @@ -/* $Id: handle.c,v 1.4 2000/03/24 22:25:39 dwelch Exp $ +/* $Id: handle.c,v 1.5 2000/03/26 22:00:10 dwelch Exp $ * * reactos/subsys/csrss/api/handle.c * @@ -20,7 +20,7 @@ NTSTATUS CsrGetObject(PCSRSS_PROCESS_DATA ProcessData, HANDLE Handle, PVOID* Object) { - *Object = ProcessData->HandleTable[((ULONG)Handle) - 1]; + *Object = ProcessData->HandleTable[(((ULONG)Handle) >> 2) - 1]; return(STATUS_SUCCESS); } @@ -41,7 +41,7 @@ NTSTATUS CsrInsertObject(PCSRSS_PROCESS_DATA ProcessData, if (ProcessData->HandleTable[i] == NULL) { ProcessData->HandleTable[i] = Object; - *Handle = (HANDLE)((i << 8) | 0x3); + *Handle = (HANDLE)(((i + 1) << 2) | 0x3); return(STATUS_SUCCESS); } } @@ -58,7 +58,7 @@ NTSTATUS CsrInsertObject(PCSRSS_PROCESS_DATA ProcessData, ProcessData->HandleTableSize * sizeof(HANDLE)); ProcessData->HandleTable = NewBlock; ProcessData->HandleTable[i] = Object; - *Handle = (HANDLE)(((i + 1) << 8) | 0x3); + *Handle = (HANDLE)(((i + 1) << 2) | 0x3); ProcessData->HandleTableSize = ProcessData->HandleTableSize + 64; return(STATUS_SUCCESS);