Created bugs in wait and timer code
authorDavid Welch <welch@cwcom.net>
Mon, 4 Jan 1999 23:01:18 +0000 (23:01 +0000)
committerDavid Welch <welch@cwcom.net>
Mon, 4 Jan 1999 23:01:18 +0000 (23:01 +0000)
svn path=/trunk/; revision=152

34 files changed:
reactos/apps/tests/hello/hello.c
reactos/apps/utils/shell/shell.c
reactos/drivers/dd/keyboard/keyboard.c
reactos/drivers/fs/vfat/blockdev.c
reactos/drivers/fs/vfat/iface.c
reactos/include/ddk/pstypes.h
reactos/include/internal/ps.h
reactos/include/kernel32/kernel32.h
reactos/include/wstring.h
reactos/lib/crtdll/crtdll.def [new file with mode: 0644]
reactos/lib/crtdll/makefile
reactos/lib/kernel32/file/create.c
reactos/lib/kernel32/file/curdir.c
reactos/lib/kernel32/file/find.c
reactos/lib/kernel32/mem/heap.c
reactos/lib/kernel32/mem/utils.c
reactos/lib/kernel32/process/proc.c
reactos/lib/kernel32/synch/wait.c
reactos/ntoskrnl/hal/x86/exp.c
reactos/ntoskrnl/hal/x86/irqhand.asm
reactos/ntoskrnl/io/create.c
reactos/ntoskrnl/io/rw.c
reactos/ntoskrnl/io/timer.c
reactos/ntoskrnl/ke/dispatch.c
reactos/ntoskrnl/ke/dpc.c
reactos/ntoskrnl/ke/timer.c
reactos/ntoskrnl/ke/wait.c
reactos/ntoskrnl/mm/npool.c
reactos/ntoskrnl/ob/object.c
reactos/ntoskrnl/ps/idle.c
reactos/ntoskrnl/ps/kill.c
reactos/ntoskrnl/ps/process.c
reactos/ntoskrnl/ps/thread.c
reactos/ntoskrnl/rtl/wstring.c

index ec06d8c..ccdd765 100644 (file)
@@ -6,5 +6,5 @@
 void main()\r
 {  \r
    NtDisplayString("Hello world\n");\r
-   ExitThread(0);\r
+   ExitProcess(0);\r
 }\r
index 8a8c4c9..6b7fee6 100644 (file)
@@ -142,7 +142,7 @@ void ExecuteCommand(char* line)
      }\r
    cmd = line;\r
    \r
-   debug_printf("cmd '%s' tail '%s'\n",cmd,tail);\r
+//   debug_printf("cmd '%s' tail '%s'\n",cmd,tail);\r
    \r
    if (cmd==NULL)\r
      {\r
@@ -194,6 +194,11 @@ void ReadLine(char* line)
             line++;\r
          }\r
      } while (!(KeyEvent.bKeyDown && KeyEvent.AsciiChar == '\n'));\r
+   ReadFile(KeyboardHandle,\r
+           &KeyEvent,\r
+           sizeof(KEY_EVENT_RECORD),\r
+           &Result,\r
+           NULL);\r
    line--;\r
    *line = 0;\r
 }\r
index 1404429..b2654d5 100644 (file)
@@ -418,7 +418,7 @@ static VOID KbdDpcRoutine(PKDPC Dpc,
    
    CHECKPOINT;
    DPRINT("KbdDpcRoutine(DeviceObject %x, Irp %x)\n",
-         DeviceObject,Irp);
+           DeviceObject,Irp);
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp,IO_NO_INCREMENT);
@@ -479,7 +479,12 @@ static unsigned int KeyboardHandler(unsigned int irq)
 
    ProcessScanCode(thisKey,isDown);
    
-   DPRINT("Key: '%c'\n",VirtualToAscii(ScanToVirtual(thisKey),isDown));
+//   DbgPrint("Key: %c\n",VirtualToAscii(ScanToVirtual(thisKey),isDown));
+//   DbgPrint("Key: %x\n",ScanToVirtual(thisKey));
+   if (ScanToVirtual(thisKey)==0x2a)
+     {
+       KeBugCheck(0);
+     }
    
    if (CurrentIrp!=NULL)
      {
index 8e3019b..6cd951f 100644 (file)
-
-
-/*
- * COPYRIGHT:        See COPYING in the top level directory
- * PROJECT:          ReactOS kernel
- * FILE:             services/fs/vfat/blockdev.c
- * PURPOSE:          Temporary sector reading support
- * PROGRAMMER:       David Welch (welch@mcmail.com)
- * UPDATE HISTORY: 
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <ddk/ntddk.h>
-#include <internal/string.h>
-#include <wstring.h>
-
-#define NDEBUG
-#include <internal/debug.h>
-
-#include "vfat.h"
-//#include "dbgpool.c"
-/* FUNCTIONS ***************************************************************/
-
-BOOLEAN VFATReadSectors(IN PDEVICE_OBJECT pDeviceObject,
-            IN ULONG    DiskSector,
-                        IN ULONG        SectorCount,
-                       IN UCHAR*       Buffer)
-{
-    LARGE_INTEGER   sectorNumber;
-    PIRP            irp;
-    IO_STATUS_BLOCK ioStatus;
-    KEVENT          event;
-    NTSTATUS        status;
-    ULONG           sectorSize;
-    PULONG          mbr;
-   
-   DPRINT("VFATReadSector(pDeviceObject %x, DiskSector %d,count %d, Buffer %x)\n",
-        pDeviceObject,DiskSector,SectorCount,Buffer);
-
-    SET_LARGE_INTEGER_LOW_PART(sectorNumber, DiskSector << 9);
-    SET_LARGE_INTEGER_HIGH_PART(sectorNumber, DiskSector >> 23);
-
-    KeInitializeEvent(&event, NotificationEvent, FALSE);
-
-    sectorSize = BLOCKSIZE*SectorCount;
-
-DPRINT("SectorCount=%d,sectorSize=%d,BLOCKSIZE=%d\n",SectorCount,sectorSize,BLOCKSIZE);
-    mbr = ExAllocatePool(NonPagedPool, sectorSize);
-    if (!mbr) {
-        return FALSE;
-    }
-
-    irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
-                                       pDeviceObject,
-                                       mbr,
-                                       sectorSize,
-                                       &sectorNumber,
-                                       &event,
-                                       &ioStatus );
-
-    if (!irp) {
-        DbgPrint("READ failed!!!\n");
-        ExFreePool(mbr);
-        return FALSE;
-    }
-
-    status = IoCallDriver(pDeviceObject,
-                          irp);
-
-    if (status == STATUS_PENDING) {
-        KeWaitForSingleObject(&event,
-                              Suspended,
-                              KernelMode,
-                              FALSE,
-                              NULL);
-        status = ioStatus.Status;
-    }
-
-    if (!NT_SUCCESS(status)) {
-        DbgPrint("IO failed!!! VFATREadSectors : Error code: %x\n", status);
-        DbgPrint("(pDeviceObject %x, DiskSector %x, Buffer %x, offset 0x%x%x)\n",
-                 pDeviceObject,
-                 DiskSector,
-                 Buffer,
-                 GET_LARGE_INTEGER_HIGH_PART(sectorNumber),
-                 GET_LARGE_INTEGER_LOW_PART(sectorNumber));
-        ExFreePool(mbr);
-        return FALSE;
-    }
-
-   RtlCopyMemory(Buffer,mbr,sectorSize);
-
-    ExFreePool(mbr);
-    return TRUE;
-}
-
-BOOLEAN VFATWriteSectors(IN PDEVICE_OBJECT pDeviceObject,
-                 IN ULONG   DiskSector,
-                         IN ULONG       SectorCount,
-                        IN UCHAR*      Buffer)
-{
-    LARGE_INTEGER   sectorNumber;
-    PIRP            irp;
-    IO_STATUS_BLOCK ioStatus;
-    KEVENT          event;
-    NTSTATUS        status;
-    ULONG           sectorSize;
-    PULONG          mbr;
-   
-    DPRINT("VFATWriteSector(pDeviceObject %x, DiskSector %d, count %d, Buffer %x)\n",
-        pDeviceObject,DiskSector,SectorCount,Buffer);
-    SET_LARGE_INTEGER_LOW_PART(sectorNumber, DiskSector << 9);
-    SET_LARGE_INTEGER_HIGH_PART(sectorNumber, DiskSector >> 23);
-
-    KeInitializeEvent(&event, NotificationEvent, FALSE);
-
-    sectorSize = BLOCKSIZE*SectorCount;
-
-    mbr = ExAllocatePool(NonPagedPool, sectorSize);
-
-    if (!mbr) {
-        return FALSE;
-    }
-    memcpy(mbr,Buffer,sectorSize);
-
-    DPRINT("Building synchronous FSD Request...\n");
-    irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE,
-                                       pDeviceObject,
-                                       mbr,
-                                       sectorSize,
-                                       &sectorNumber,
-                                       &event,
-                                       &ioStatus );
-
-    if (!irp) {
-        DbgPrint("WRITE failed!!!\n");
-        ExFreePool(mbr);
-        return FALSE;
-    }
-
-    DPRINT("Calling IO Driver...\n");
-    status = IoCallDriver(pDeviceObject,
-                          irp);
-
-    DPRINT("Waiting for IO Operation...\n");
-    if (status == STATUS_PENDING) {
-        KeWaitForSingleObject(&event,
-                              Suspended,
-                              KernelMode,
-                              FALSE,
-                              NULL);
-        DPRINT("Getting IO Status...\n");
-        status = ioStatus.Status;
-    }
-
-    if (!NT_SUCCESS(status)) {
-        DbgPrint("IO failed!!! VFATWriteSectors : Error code: %x\n", status);
-        ExFreePool(mbr);
-        return FALSE;
-    }
-
-    DPRINT("Copying memory...\n");
-   RtlCopyMemory(Buffer,mbr,sectorSize);
-
-    ExFreePool(mbr);
-    DPRINT("Block request succeeded\n");
-    return TRUE;
-}
-
-
+/*\r
+ * COPYRIGHT:        See COPYING in the top level directory\r
+ * PROJECT:          ReactOS kernel\r
+ * FILE:             services/fs/vfat/blockdev.c\r
+ * PURPOSE:          Temporary sector reading support\r
+ * PROGRAMMER:       David Welch (welch@mcmail.com)\r
+ * UPDATE HISTORY: \r
+ */\r
+\r
+/* INCLUDES *****************************************************************/\r
+\r
+#include <ddk/ntddk.h>\r
+#include <internal/string.h>\r
+#include <wstring.h>\r
+\r
+#define NDEBUG\r
+#include <internal/debug.h>\r
+\r
+#include "vfat.h"\r
+\r
+/* FUNCTIONS ***************************************************************/\r
+\r
+BOOLEAN VFATReadSectors(IN PDEVICE_OBJECT pDeviceObject,\r
+                        IN ULONG    DiskSector,\r
+                        IN ULONG        SectorCount,\r
+                       IN UCHAR*       Buffer)\r
+{\r
+    LARGE_INTEGER   sectorNumber;\r
+    PIRP            irp;\r
+    IO_STATUS_BLOCK ioStatus;\r
+    KEVENT          event;\r
+    NTSTATUS        status;\r
+    ULONG           sectorSize;\r
+   \r
+    SET_LARGE_INTEGER_LOW_PART(sectorNumber, DiskSector << 9);\r
+    SET_LARGE_INTEGER_HIGH_PART(sectorNumber, DiskSector >> 23);\r
+    KeInitializeEvent(&event, NotificationEvent, FALSE);\r
+    sectorSize = BLOCKSIZE * SectorCount;\r
+\r
+    /* FIXME: this routine does not need to alloc mem and copy  */\r
+\r
+\r
+    DPRINT("VFATReadSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n",\r
+           pDeviceObject,\r
+           DiskSector,\r
+           Buffer);\r
+    DPRINT("sectorNumber %08lx:%08lx sectorSize %ld\n", \r
+           (unsigned long int)GET_LARGE_INTEGER_HIGH_PART(sectorNumber),\r
+           (unsigned long int)GET_LARGE_INTEGER_LOW_PART(sectorNumber),\r
+           sectorSize);\r
+\r
+\r
+    DPRINT("Building synchronous FSD Request...\n");\r
+    irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,\r
+                                       pDeviceObject,\r
+                                       Buffer,\r
+                                       sectorSize,\r
+                                       &sectorNumber,\r
+                                       &event,\r
+                                       &ioStatus );\r
+\r
+    if (!irp) {\r
+        DbgPrint("READ failed!!!\n");\r
+        return FALSE;\r
+    }\r
+\r
+    DPRINT("Calling IO Driver...\n");\r
+    status = IoCallDriver(pDeviceObject,\r
+                          irp);\r
+\r
+    DPRINT("Waiting for IO Operation...\n");\r
+    if (status == STATUS_PENDING) {\r
+        KeWaitForSingleObject(&event,\r
+                              Suspended,\r
+                              KernelMode,\r
+                              FALSE,\r
+                              NULL);\r
+        DPRINT("Getting IO Status...\n");\r
+        status = ioStatus.Status;\r
+    }\r
+\r
+    if (!NT_SUCCESS(status)) {\r
+        DbgPrint("IO failed!!! VFATREadSectors : Error code: %x\n", status);\r
+        DbgPrint("(pDeviceObject %x, DiskSector %x, Buffer %x, offset 0x%x%x)\n",\r
+                 pDeviceObject,\r
+                 DiskSector,\r
+                 Buffer,\r
+                 GET_LARGE_INTEGER_HIGH_PART(sectorNumber),\r
+                 GET_LARGE_INTEGER_LOW_PART(sectorNumber));\r
+        return FALSE;\r
+    }\r
+\r
+    DPRINT("Copying memory...\n");\r
+    DPRINT("Block request succeeded\n");\r
+    return TRUE;\r
+}\r
+\r
+BOOLEAN VFATWriteSectors(IN PDEVICE_OBJECT pDeviceObject,\r
+                 IN ULONG   DiskSector,\r
+                         IN ULONG       SectorCount,\r
+                        IN UCHAR*      Buffer)\r
+{\r
+    LARGE_INTEGER   sectorNumber;\r
+    PIRP            irp;\r
+    IO_STATUS_BLOCK ioStatus;\r
+    KEVENT          event;\r
+    NTSTATUS        status;\r
+    ULONG           sectorSize;\r
+    PULONG          mbr;\r
+   \r
+   DPRINT("VFATWriteSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n",\r
+           pDeviceObject,DiskSector,Buffer);\r
+\r
+    SET_LARGE_INTEGER_LOW_PART(sectorNumber, DiskSector << 9);\r
+    SET_LARGE_INTEGER_HIGH_PART(sectorNumber, DiskSector >> 23);\r
+\r
+    KeInitializeEvent(&event, NotificationEvent, FALSE);\r
+\r
+    sectorSize = BLOCKSIZE*SectorCount;\r
+\r
+    mbr = ExAllocatePool(NonPagedPool, sectorSize);\r
+\r
+    if (!mbr) {\r
+        return FALSE;\r
+    }\r
+\r
+\r
+    DPRINT("Building synchronous FSD Request...\n");\r
+    irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE,\r
+                                       pDeviceObject,\r
+                                       mbr,\r
+                                       sectorSize,\r
+                                       &sectorNumber,\r
+                                       &event,\r
+                                       &ioStatus );\r
+\r
+    if (!irp) {\r
+        DbgPrint("WRITE failed!!!\n");\r
+        ExFreePool(mbr);\r
+        return FALSE;\r
+    }\r
+\r
+    DPRINT("Calling IO Driver...\n");\r
+    status = IoCallDriver(pDeviceObject,\r
+                          irp);\r
+\r
+    DPRINT("Waiting for IO Operation...\n");\r
+    if (status == STATUS_PENDING) {\r
+        KeWaitForSingleObject(&event,\r
+                              Suspended,\r
+                              KernelMode,\r
+                              FALSE,\r
+                              NULL);\r
+        DPRINT("Getting IO Status...\n");\r
+        status = ioStatus.Status;\r
+    }\r
+\r
+    if (!NT_SUCCESS(status)) {\r
+        DbgPrint("IO failed!!! VFATWriteSectors : Error code: %x\n", status);\r
+        ExFreePool(mbr);\r
+        return FALSE;\r
+    }\r
+\r
+    DPRINT("Copying memory...\n");\r
+   RtlCopyMemory(Buffer,mbr,sectorSize);\r
+\r
+    ExFreePool(mbr);\r
+    DPRINT("Block request succeeded\n");\r
+    return TRUE;\r
+}\r
+\r
index 7b7bec7..7cd05a9 100644 (file)
@@ -73,7 +73,7 @@ ULONG Fat16GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
    Block=(PUSHORT)DeviceExt->FAT;
    CurrentCluster = Block[CurrentCluster];
    if (CurrentCluster >= 0xfff8 && CurrentCluster <= 0xffff)
-    CurrentCluster = 0xffffffff;
+     CurrentCluster = 0xffffffff;
    DPRINT("Returning %x\n",CurrentCluster);
    return(CurrentCluster);
 }
@@ -821,7 +821,14 @@ NTSTATUS FsdOpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
       Status = FindFile(DeviceExt,Fcb,ParentFcb,current,NULL,NULL);
        if (Status != STATUS_SUCCESS)
          {
-             /* FIXME: should the VfatFCB be freed here?  */
+            if (Fcb != NULL)
+              {
+                 ExFreePool(Fcb);
+              }
+            if (ParentFcb != NULL)
+              {
+                 ExFreePool(ParentFcb);
+              }
             return(Status);
          }
        Temp = Fcb;
@@ -863,7 +870,7 @@ BOOLEAN FsdHasFileSystem(PDEVICE_OBJECT DeviceToMount)
  */
 {
    BootSector* Boot;
-
+   
    Boot = ExAllocatePool(NonPagedPool,512);
 
    VFATReadSectors(DeviceToMount, 0, 1, (UCHAR *)Boot);
index 0dc179b..5f56101 100644 (file)
-#ifndef __INCLUDE_DDK_PSTYPES_H
-#define __INCLUDE_DDK_PSTYPES_H
-
-#undef WIN32_LEAN_AND_MEAN
-#include <windows.h> // might be redundant
-#include <kernel32/heap.h>
-#include <kernel32/atom.h>
-#include <internal/hal.h>
-
-#ifndef TLS_MINIMUM_AVAILABLE
-       #define TLS_MINIMUM_AVAILABLE   (64)
-#endif
-#ifndef MAX_PATH
-       #define MAX_PATH        (260)
-#endif
-
-typedef NTSTATUS (*PKSTART_ROUTINE)(PVOID StartContext);
-
-typedef struct _STACK_INFORMATION 
-{
-       PVOID   BaseAddress;
-       PVOID   UpperAddress;
-} STACK_INFORMATION, *PSTACK_INFORMATION;
-
-typedef struct linux_sigcontext {
-        int     sc_gs;
-        int     sc_fs;
-        int     sc_es;
-        int     sc_ds;
-        int     sc_edi;
-        int     sc_esi;
-        int     sc_ebp;
-        int     sc_esp;
-        int     sc_ebx;
-        int     sc_edx;
-        int     sc_ecx;
-        int     sc_eax;
-        int     sc_trapno;
-        int     sc_err;
-        int     sc_eip;
-        int     sc_cs;
-        int     sc_eflags;
-        int     sc_esp_at_signal;
-        int     sc_ss;
-        int     sc_387;
-        int     sc_mask;
-        int     sc_cr2;
-} TRAP_FRAME, *PTRAP_FRAME;
-
-typedef ULONG THREADINFOCLASS;
-
-typedef struct _STARTUPINFOW { 
-  DWORD   cb; 
-  WCHAR          WindowTitle[MAX_PATH];
-  WCHAR          ImageFile[MAX_PATH];  
-  WCHAR          CommandLine[MAX_PATH];
-  WCHAR          DllPath[MAX_PATH];
-  LPWSTR  Reserved[MAX_PATH]; 
-  LPWSTR  Desktop[MAX_PATH]; 
-  LPWSTR  Title[MAX_PATH]; 
-  DWORD   dwX; 
-  DWORD   dwY; 
-  DWORD   dwXSize; 
-  DWORD   dwYSize; 
-  DWORD   dwXCountChars; 
-  DWORD   dwYCountChars; 
-  DWORD   dwFillAttribute; 
-  DWORD   dwFlags; 
-  WORD    wShowWindow; 
-  WORD    cbReserved2; 
-  unsigned char * lpReserved2; 
-  HANDLE  hStdInput; 
-  HANDLE  hStdOutput; 
-  HANDLE  hStdError; 
-} PROCESSINFOW, *PPROCESSINFOW; 
-
-
-
-typedef struct _LDR {
-       UCHAR   Initialized;
-       UCHAR   InInitializationOrderModuleList;
-       PVOID   InLoadOrderModuleList;
-       PVOID   InMemoryOrderModuleList;
-} LDR, *PLDR;
-
-
-typedef struct _NT_PEB
-{
-       UCHAR                   InheritedAddressSpace;
-       UCHAR                   ReadImageFileExecOptions;
-       UCHAR                   BeingDebugged;
-       LONG                    ImageBaseAddress; 
-       LDR                     Ldr;
-
-       WORD                    NumberOfProcessors;
-       WORD                    NtGlobalFlag;
-
-       PPROCESSINFOW           StartupInfo;
-       PHEAP                   ProcessHeap; 
-       ATOMTABLE               LocalAtomTable;
-       LPCRITICAL_SECTION      CriticalSection;
-       DWORD                   CriticalSectionTimeout; 
-       WORD                    MajorVersion; 
-       WORD                    MinorVersion; 
-       WORD                    BuildNumber;  
-       WORD                    PlatformId;     
-} NT_PEB, *PNT_PEB;    
-
-typedef struct _CLIENT_ID 
-{
-    HANDLE UniqueProcess;
-    HANDLE UniqueThread;
-} CLIENT_ID, *PCLIENT_ID;
-
-typedef struct _NT_TIB {
-    struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
-    PVOID StackBase;
-    PVOID StackLimit;
-    PVOID SubSystemTib;
-    union {
-        PVOID FiberData;
-        ULONG Version;
-    } Fib;
-    PVOID ArbitraryUserPointer;
-    struct _NT_TIB *Self;
-} NT_TIB, *PNT_TIB;
-
-typedef struct _NT_TEB
-{
-
-       NT_TIB                  Tib; 
-       CLIENT_ID               Cid;
-       HANDLE                  RPCHandle;
-       PVOID                   TlsData[TLS_MINIMUM_AVAILABLE];
-       DWORD                   dwTlsIndex;
-       NT_PEB                  *Peb;   
-       DWORD                   LastErrorCode;
-       NTSTATUS                LastStatusValue; 
-       DWORD                   LockCount;
-       UCHAR                   HardErrorMode;
-       
-} NT_TEB;
-
-typedef struct _KTHREAD 
-{
-       DISPATCHER_HEADER       DispatcherHeader;
-       TIME                    ElapsedTime;
-       TIME                    KernelTime;
-       TIME                    UserTime;
-       STACK_INFORMATION       StackInformation;
-       PVOID                   ServiceDescriptorTable;  // points to KeServiceDescriptorTable
-       KAFFINITY               Affinity;
-       KPRIORITY               CurrentPriority;
-       KPRIORITY               BasePriority;
-       ULONG                   Quantum;
-       UCHAR                   ThreadState; //Thread state is a typeless enum, otherwise it should be const integer
-       ULONG                   FreezeCount;
-       LONG                    SuspendCount;
-       PTRAP_FRAME             TrapFrame; 
-       PVOID                   *Tls;
-       KWAIT_BLOCK             WaitBlock[4];   
-       struct _KMUTANT*        MutantList;
-       PLIST_ENTRY             ApcList;
-       UCHAR                   KernelApcDisable;
-       KTIMER                  TimerBlock;
-       KDEVICE_QUEUE           DeviceQueue;
-       NT_TEB*                 Teb;
-   
-        /*
-        * PURPOSE: CPU state
-        * NOTE: I have temporarily added this to give somewhere to store
-        * cpu state when the thread isn't running
-        */
-        hal_thread_state                   Context;
-        LIST_ENTRY Entry;
-        ULONG LastTick;
-} KTHREAD, *PKTHREAD;
-
-
-// According to documentation the stack should have a commited [ 1 page ] and
-// a reserved part [ 1 M ] but can be specified otherwise in the image file.
-
-typedef struct _INITIAL_TEB {
-       PVOID StackBase;
-       PVOID StackLimit;
-       PVOID StackCommit;
-       PVOID StackCommitMax;
-       PVOID StackReserved;
-} INITIAL_TEB, *PINITIAL_TEB;
-
-
-
-
-
-
-// TopLevelIrp can be one of the following values:
-// FIXME I belong somewhere else
-
-#define        FSRTL_FSP_TOP_LEVEL_IRP                 (0x01)
-#define        FSRTL_CACHE_TOP_LEVEL_IRP               (0x02)
-#define        FSRTL_MOD_WRITE_TOP_LEVEL_IRP           (0x03)
-#define                FSRTL_FAST_IO_TOP_LEVEL_IRP             (0x04)
-#define                FSRTL_MAX_TOP_LEVEL_IRP_FLAG            (0x04)
-
-typedef struct _TOP_LEVEL_IRP
-{
-       PIRP TopLevelIrp;
-       ULONG TopLevelIrpConst;
-} TOP_LEVEL_IRP;
-
-typedef struct _ETHREAD {
-       KTHREAD                 Tcb;
-       TIME                    CreateTime;
-       TIME                    ExitTime;
-       NTSTATUS                ExitStatus;
-       LIST_ENTRY              PostBlockList;
-       LIST_ENTRY              TerminationPortList;  
-       ULONG                   ActiveTimerListLock;
-       PVOID                   ActiveTimerListHead;
-       CLIENT_ID               Cid;
-       PLARGE_INTEGER          LpcReplySemaphore;
-       PVOID                   LpcReplyMessage;
-       PLARGE_INTEGER          LpcReplyMessageId;
-       PVOID                   ImpersonationInfo;
-       LIST_ENTRY              IrpList; //
-       TOP_LEVEL_IRP           TopLevelIrp;
-       ULONG                   ReadClusterSize;
-       UCHAR                   ForwardClusterOnly;
-       UCHAR                   DisablePageFaultClustering;
-       UCHAR                   DeadThread;
-       UCHAR                   HasTerminated;
-       ACCESS_MASK             GrantedAccess;
-       struct _EPROCESS*       ThreadsProcess;
-       PKSTART_ROUTINE         StartAddress;
-       LPTHREAD_START_ROUTINE  Win32StartAddress; // Should Specify a win32 start func
-       UCHAR                   LpcExitThreadCalled;
-       UCHAR                   HardErrorsAreDisabled;
-} ETHREAD, *PETHREAD;
-
-
-typedef struct _KPROCESS 
-{
-   DISPATCHER_HEADER   DispatcherHeader;
-   PVOID               PageTableDirectory; // FIXME: I shoud point to a PTD
-   TIME                        ElapsedTime;
-   TIME                        KernelTime;
-   TIME                        UserTime;
-   LIST_ENTRY          InMemoryList;  
-   LIST_ENTRY          SwappedOutList;         
-   KSPIN_LOCK          SpinLock;
-   KAFFINITY           Affinity;
-   ULONG               StackCount;
-   KPRIORITY           BasePriority;
-   ULONG               DefaultThreadQuantum;
-   UCHAR               ProcessState;
-   ULONG               ThreadSeed;
-   UCHAR               DisableBoost;
-   
-   /*
-    * Added by David Welch (welch@mcmail.com)
-    */
-   LIST_ENTRY MemoryAreaList;
-   HANDLE_TABLE HandleTable;
-} KPROCESS, *PKPROCESS;
-
-typedef struct _EPROCESS
-{
-   KPROCESS Pcb;
-} EPROCESS, *PEPROCESS;
-
-#endif /* __INCLUDE_DDK_PSTYPES_H */
+#ifndef __INCLUDE_DDK_PSTYPES_H\r
+#define __INCLUDE_DDK_PSTYPES_H\r
+\r
+#undef WIN32_LEAN_AND_MEAN\r
+#include <windows.h> // might be redundant\r
+#include <kernel32/heap.h>\r
+#include <kernel32/atom.h>\r
+#include <internal/hal.h>\r
+\r
+#ifndef TLS_MINIMUM_AVAILABLE\r
+       #define TLS_MINIMUM_AVAILABLE   (64)\r
+#endif\r
+#ifndef MAX_PATH\r
+       #define MAX_PATH        (260)\r
+#endif\r
+\r
+typedef NTSTATUS (*PKSTART_ROUTINE)(PVOID StartContext);\r
+\r
+typedef struct _STACK_INFORMATION \r
+{\r
+       PVOID   BaseAddress;\r
+       PVOID   UpperAddress;\r
+} STACK_INFORMATION, *PSTACK_INFORMATION;\r
+\r
+typedef struct linux_sigcontext {\r
+        int     sc_gs;\r
+        int     sc_fs;\r
+        int     sc_es;\r
+        int     sc_ds;\r
+        int     sc_edi;\r
+        int     sc_esi;\r
+        int     sc_ebp;\r
+        int     sc_esp;\r
+        int     sc_ebx;\r
+        int     sc_edx;\r
+        int     sc_ecx;\r
+        int     sc_eax;\r
+        int     sc_trapno;\r
+        int     sc_err;\r
+        int     sc_eip;\r
+        int     sc_cs;\r
+        int     sc_eflags;\r
+        int     sc_esp_at_signal;\r
+        int     sc_ss;\r
+        int     sc_387;\r
+        int     sc_mask;\r
+        int     sc_cr2;\r
+} TRAP_FRAME, *PTRAP_FRAME;\r
+\r
+typedef ULONG THREADINFOCLASS;\r
+\r
+typedef struct _STARTUPINFOW { \r
+  DWORD   cb; \r
+  WCHAR          WindowTitle[MAX_PATH];\r
+  WCHAR          ImageFile[MAX_PATH];  \r
+  WCHAR          CommandLine[MAX_PATH];\r
+  WCHAR          DllPath[MAX_PATH];\r
+  LPWSTR  Reserved[MAX_PATH]; \r
+  LPWSTR  Desktop[MAX_PATH]; \r
+  LPWSTR  Title[MAX_PATH]; \r
+  DWORD   dwX; \r
+  DWORD   dwY; \r
+  DWORD   dwXSize; \r
+  DWORD   dwYSize; \r
+  DWORD   dwXCountChars; \r
+  DWORD   dwYCountChars; \r
+  DWORD   dwFillAttribute; \r
+  DWORD   dwFlags; \r
+  WORD    wShowWindow; \r
+  WORD    cbReserved2; \r
+  unsigned char * lpReserved2; \r
+  HANDLE  hStdInput; \r
+  HANDLE  hStdOutput; \r
+  HANDLE  hStdError; \r
+} PROCESSINFOW, *PPROCESSINFOW; \r
+\r
+\r
+\r
+typedef struct _LDR {\r
+       UCHAR   Initialized;\r
+       UCHAR   InInitializationOrderModuleList;\r
+       PVOID   InLoadOrderModuleList;\r
+       PVOID   InMemoryOrderModuleList;\r
+} LDR, *PLDR;\r
+\r
+\r
+typedef struct _NT_PEB\r
+{\r
+       UCHAR                   InheritedAddressSpace;\r
+       UCHAR                   ReadImageFileExecOptions;\r
+       UCHAR                   BeingDebugged;\r
+       LONG                    ImageBaseAddress; \r
+       LDR                     Ldr;\r
+\r
+       WORD                    NumberOfProcessors;\r
+       WORD                    NtGlobalFlag;\r
+\r
+       PPROCESSINFOW           StartupInfo;\r
+       PHEAP                   ProcessHeap; \r
+       ATOMTABLE               LocalAtomTable;\r
+       LPCRITICAL_SECTION      CriticalSection;\r
+       DWORD                   CriticalSectionTimeout; \r
+       WORD                    MajorVersion; \r
+       WORD                    MinorVersion; \r
+       WORD                    BuildNumber;  \r
+       WORD                    PlatformId;     \r
+} NT_PEB, *PNT_PEB;    \r
+\r
+typedef struct _CLIENT_ID \r
+{\r
+    HANDLE UniqueProcess;\r
+    HANDLE UniqueThread;\r
+} CLIENT_ID, *PCLIENT_ID;\r
+\r
+typedef struct _NT_TIB {\r
+    struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;\r
+    PVOID StackBase;\r
+    PVOID StackLimit;\r
+    PVOID SubSystemTib;\r
+    union {\r
+        PVOID FiberData;\r
+        ULONG Version;\r
+    } Fib;\r
+    PVOID ArbitraryUserPointer;\r
+    struct _NT_TIB *Self;\r
+} NT_TIB, *PNT_TIB;\r
+\r
+typedef struct _NT_TEB\r
+{\r
+\r
+       NT_TIB                  Tib; \r
+       CLIENT_ID               Cid;\r
+       HANDLE                  RPCHandle;\r
+       PVOID                   TlsData[TLS_MINIMUM_AVAILABLE];\r
+       DWORD                   dwTlsIndex;\r
+       NT_PEB                  *Peb;   \r
+       DWORD                   LastErrorCode;\r
+       NTSTATUS                LastStatusValue; \r
+       DWORD                   LockCount;\r
+       UCHAR                   HardErrorMode;\r
+       \r
+} NT_TEB;\r
+\r
+typedef struct _KTHREAD \r
+{\r
+       DISPATCHER_HEADER       DispatcherHeader;\r
+       TIME                    ElapsedTime;\r
+       TIME                    KernelTime;\r
+       TIME                    UserTime;\r
+       STACK_INFORMATION       StackInformation;\r
+       PVOID                   ServiceDescriptorTable;  // points to KeServiceDescriptorTable\r
+       KAFFINITY               Affinity;\r
+       KPRIORITY               CurrentPriority;\r
+       KPRIORITY               BasePriority;\r
+       ULONG                   Quantum;\r
+       UCHAR                   ThreadState; //Thread state is a typeless enum, otherwise it should be const integer\r
+       ULONG                   FreezeCount;\r
+       LONG                    SuspendCount;\r
+       PTRAP_FRAME             TrapFrame; \r
+       PVOID                   *Tls;\r
+       KWAIT_BLOCK             WaitBlock[4];   \r
+       struct _KMUTANT*        MutantList;\r
+       PLIST_ENTRY             ApcList;\r
+       UCHAR                   KernelApcDisable;\r
+       KTIMER                  TimerBlock;\r
+       KDEVICE_QUEUE           DeviceQueue;\r
+       NT_TEB*                 Teb;\r
+   \r
+        /*\r
+        * PURPOSE: CPU state\r
+        * NOTE: I have temporarily added this to give somewhere to store\r
+        * cpu state when the thread isn't running\r
+        */\r
+        hal_thread_state                   Context;\r
+        LIST_ENTRY Entry;\r
+        ULONG LastTick;\r
+} KTHREAD, *PKTHREAD;\r
+\r
+\r
+// According to documentation the stack should have a commited [ 1 page ] and\r
+// a reserved part [ 1 M ] but can be specified otherwise in the image file.\r
+\r
+typedef struct _INITIAL_TEB {\r
+       PVOID StackBase;\r
+       PVOID StackLimit;\r
+       PVOID StackCommit;\r
+       PVOID StackCommitMax;\r
+       PVOID StackReserved;\r
+} INITIAL_TEB, *PINITIAL_TEB;\r
+\r
+\r
+\r
+\r
+\r
+\r
+// TopLevelIrp can be one of the following values:\r
+// FIXME I belong somewhere else\r
+\r
+#define        FSRTL_FSP_TOP_LEVEL_IRP                 (0x01)\r
+#define        FSRTL_CACHE_TOP_LEVEL_IRP               (0x02)\r
+#define        FSRTL_MOD_WRITE_TOP_LEVEL_IRP           (0x03)\r
+#define                FSRTL_FAST_IO_TOP_LEVEL_IRP             (0x04)\r
+#define                FSRTL_MAX_TOP_LEVEL_IRP_FLAG            (0x04)\r
+\r
+typedef struct _TOP_LEVEL_IRP\r
+{\r
+       PIRP TopLevelIrp;\r
+       ULONG TopLevelIrpConst;\r
+} TOP_LEVEL_IRP;\r
+\r
+typedef struct _ETHREAD {\r
+       KTHREAD                 Tcb;\r
+       TIME                    CreateTime;\r
+       TIME                    ExitTime;\r
+       NTSTATUS                ExitStatus;\r
+       LIST_ENTRY              PostBlockList;\r
+       LIST_ENTRY              TerminationPortList;  \r
+       ULONG                   ActiveTimerListLock;\r
+       PVOID                   ActiveTimerListHead;\r
+       CLIENT_ID               Cid;\r
+       PLARGE_INTEGER          LpcReplySemaphore;\r
+       PVOID                   LpcReplyMessage;\r
+       PLARGE_INTEGER          LpcReplyMessageId;\r
+       PVOID                   ImpersonationInfo;\r
+       LIST_ENTRY              IrpList; //\r
+       TOP_LEVEL_IRP           TopLevelIrp;\r
+       ULONG                   ReadClusterSize;\r
+       UCHAR                   ForwardClusterOnly;\r
+       UCHAR                   DisablePageFaultClustering;\r
+       UCHAR                   DeadThread;\r
+       UCHAR                   HasTerminated;\r
+       ACCESS_MASK             GrantedAccess;\r
+       struct _EPROCESS*       ThreadsProcess;\r
+       PKSTART_ROUTINE         StartAddress;\r
+       LPTHREAD_START_ROUTINE  Win32StartAddress; // Should Specify a win32 start func\r
+       UCHAR                   LpcExitThreadCalled;\r
+       UCHAR                   HardErrorsAreDisabled;\r
+} ETHREAD, *PETHREAD;\r
+\r
+\r
+typedef struct _KPROCESS \r
+{\r
+   DISPATCHER_HEADER   DispatcherHeader;\r
+   PVOID               PageTableDirectory; // FIXME: I shoud point to a PTD\r
+   TIME                        ElapsedTime;\r
+   TIME                        KernelTime;\r
+   TIME                        UserTime;\r
+   LIST_ENTRY          InMemoryList;  \r
+   LIST_ENTRY          SwappedOutList;         \r
+   KSPIN_LOCK          SpinLock;\r
+   KAFFINITY           Affinity;\r
+   ULONG               StackCount;\r
+   KPRIORITY           BasePriority;\r
+   ULONG               DefaultThreadQuantum;\r
+   UCHAR               ProcessState;\r
+   ULONG               ThreadSeed;\r
+   UCHAR               DisableBoost;\r
+   \r
+   /*\r
+    * Added by David Welch (welch@mcmail.com)\r
+    */\r
+   LIST_ENTRY MemoryAreaList;\r
+   HANDLE_TABLE HandleTable;\r
+} KPROCESS, *PKPROCESS;\r
+\r
+typedef struct _EPROCESS\r
+{\r
+   KPROCESS Pcb;\r
+} EPROCESS, *PEPROCESS;\r
+\r
+#define PROCESS_STATE_TERMINATED (1)\r
+#define PROCESS_STATE_ACTIVE     (2)\r
+\r
+#endif /* __INCLUDE_DDK_PSTYPES_H */\r
index 623c200..c6ee283 100644 (file)
@@ -1,57 +1,58 @@
-#ifndef __INCLUDE_INTERNAL_PSMGR_H
-#define __INCLUDE_INTERNAL_PSMGR_H
-
-#include <internal/hal.h>
-
-extern PEPROCESS SystemProcess;
-extern HANDLE SystemProcessHandle;
-
-extern POBJECT_TYPE PsThreadType;
-extern POBJECT_TYPE PsProcessType;
-
-void PsInitThreadManagment(void);
-VOID PsInitProcessManagment(VOID);
-VOID PsInitIdleThread(VOID);
-VOID PsDispatchThread(VOID);
-
-/*
- * PURPOSE: Thread states
- */
-enum
-{
-   /*
-    * PURPOSE: Don't touch 
-    */
-   THREAD_STATE_INVALID,
-     
-  /*
-    * PURPOSE: Waiting to be dispatched
-    */
-   THREAD_STATE_RUNNABLE,
-     
-   /*
-    * PURPOSE: Currently running
-    */
-   THREAD_STATE_RUNNING,
-     
-   /*
-    * PURPOSE: Doesn't want to run
-    */
-   THREAD_STATE_SUSPENDED,
-     
-   /*
-    * Waiting to be freed
-    */
-   THREAD_STATE_TERMINATED,
-};
-
-/*
- * Functions the HAL must provide
- */
-
-void HalInitFirstTask(PETHREAD thread);
-BOOLEAN HalInitTask(PETHREAD thread, PKSTART_ROUTINE fn, PVOID StartContext);
-void HalTaskSwitch(PKTHREAD thread);
-NTSTATUS HalInitTaskWithContext(PETHREAD Thread, PCONTEXT Context);
-
-#endif
+#ifndef __INCLUDE_INTERNAL_PSMGR_H\r
+#define __INCLUDE_INTERNAL_PSMGR_H\r
+\r
+#include <internal/hal.h>\r
+\r
+extern PEPROCESS SystemProcess;\r
+extern HANDLE SystemProcessHandle;\r
+\r
+extern POBJECT_TYPE PsThreadType;\r
+extern POBJECT_TYPE PsProcessType;\r
+\r
+void PsInitThreadManagment(void);\r
+VOID PsInitProcessManagment(VOID);\r
+VOID PsInitIdleThread(VOID);\r
+VOID PsDispatchThread(VOID);\r
+VOID PiTerminateProcessThreads(PEPROCESS Process, NTSTATUS ExitStatus);\r
+\r
+/*\r
+ * PURPOSE: Thread states\r
+ */\r
+enum\r
+{\r
+   /*\r
+    * PURPOSE: Don't touch \r
+    */\r
+   THREAD_STATE_INVALID,\r
+     \r
+  /*\r
+    * PURPOSE: Waiting to be dispatched\r
+    */\r
+   THREAD_STATE_RUNNABLE,\r
+     \r
+   /*\r
+    * PURPOSE: Currently running\r
+    */\r
+   THREAD_STATE_RUNNING,\r
+     \r
+   /*\r
+    * PURPOSE: Doesn't want to run\r
+    */\r
+   THREAD_STATE_SUSPENDED,\r
+     \r
+   /*\r
+    * Waiting to be freed\r
+    */\r
+   THREAD_STATE_TERMINATED,\r
+};\r
+\r
+/*\r
+ * Functions the HAL must provide\r
+ */\r
+\r
+void HalInitFirstTask(PETHREAD thread);\r
+BOOLEAN HalInitTask(PETHREAD thread, PKSTART_ROUTINE fn, PVOID StartContext);\r
+void HalTaskSwitch(PKTHREAD thread);\r
+NTSTATUS HalInitTaskWithContext(PETHREAD Thread, PCONTEXT Context);\r
+\r
+#endif\r
index 3c8f63f..0d81a2e 100644 (file)
@@ -1,5 +1,11 @@
 #include <windows.h>
 
+#ifdef NDEBUG
+#define DPRINT(args...) 
+#else
+#define DPRINT(args...) do { dprintf("(KERNEL32:%s:%d) ",__FILE__,__LINE__); dprintf(args); } while(0);
+#endif
+
 void dprintf(char* fmt, ...);
 void aprintf(char* fmt, ...);
 
index a1c8524..91182a8 100644 (file)
@@ -1,51 +1,52 @@
-/*
- * Adapted from linux for the reactos kernel, march 1998 -- David Welch
- * Added wide character string functions, june 1998 -- Boudewijn Dekker
- * Removed extern specifier from ___wcstok, june 1998 -- Boudewijn Dekker
- * Added wcsicmp and wcsnicmp -- Boudewijn Dekker
- */
-
-#ifndef _LINUX_WSTRING_H_
-#define _LINUX_WSTRING_H_
-
-#include <types.h>        /* for size_t */
-
-typedef unsigned short wchar_t;
-
-#ifndef NULL
-#define NULL ((void *) 0)
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern wchar_t * ___wcstok;
-extern wchar_t * wcscpy(wchar_t *,const wchar_t *);
-extern wchar_t * wcsncpy(wchar_t *,const wchar_t *, __kernel_size_t);
-extern wchar_t * wcscat(wchar_t *, const wchar_t *);
-extern wchar_t * wcsncat(wchar_t *, const wchar_t *, __kernel_size_t);
-extern int wcscmp(const wchar_t *,const wchar_t *);
-extern int wcsncmp(const wchar_t *,const wchar_t *,__kernel_size_t);
-wchar_t* wcschr(const wchar_t* str, wchar_t ch);
-extern wchar_t * wcsrchr(const wchar_t *,wchar_t);
-extern wchar_t * wcspbrk(const wchar_t *,const wchar_t *);
-extern wchar_t * wcstok(wchar_t *,const wchar_t *);
-extern wchar_t * wcsstr(const wchar_t *,const wchar_t *);
-extern size_t wcsnlen(const wchar_t * s, size_t count);
-extern int wcsicmp(const wchar_t* cs,const wchar_t * ct);
-extern int wcsnicmp(const wchar_t* cs,const wchar_t * ct, size_t count);
-extern size_t wcscspn(const wchar_t *, const wchar_t *);
-extern size_t wcslen(const wchar_t *);
-extern size_t wcsspn(const wchar_t *, const wchar_t *);
-
-extern unsigned long wstrlen(PWSTR);
-WCHAR wtoupper(WCHAR c);
-WCHAR wtolower(WCHAR c);
-   
-#ifdef __cplusplus
-}
-#endif
-
-#endif 
-
+/*\r
+ * Adapted from linux for the reactos kernel, march 1998 -- David Welch\r
+ * Added wide character string functions, june 1998 -- Boudewijn Dekker\r
+ * Removed extern specifier from ___wcstok, june 1998 -- Boudewijn Dekker\r
+ * Added wcsicmp and wcsnicmp -- Boudewijn Dekker\r
+ */\r
+\r
+#ifndef _LINUX_WSTRING_H_\r
+#define _LINUX_WSTRING_H_\r
+\r
+#include <types.h>        /* for size_t */\r
+\r
+typedef unsigned short wchar_t;\r
+\r
+#ifndef NULL\r
+#define NULL ((void *) 0)\r
+#endif\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+wchar_t* wstrdup(const wchar_t* src);\r
+extern wchar_t * ___wcstok;\r
+extern wchar_t * wcscpy(wchar_t *,const wchar_t *);\r
+extern wchar_t * wcsncpy(wchar_t *,const wchar_t *, __kernel_size_t);\r
+extern wchar_t * wcscat(wchar_t *, const wchar_t *);\r
+extern wchar_t * wcsncat(wchar_t *, const wchar_t *, __kernel_size_t);\r
+extern int wcscmp(const wchar_t *,const wchar_t *);\r
+extern int wcsncmp(const wchar_t *,const wchar_t *,__kernel_size_t);\r
+wchar_t* wcschr(const wchar_t* str, wchar_t ch);\r
+extern wchar_t * wcsrchr(const wchar_t *,wchar_t);\r
+extern wchar_t * wcspbrk(const wchar_t *,const wchar_t *);\r
+extern wchar_t * wcstok(wchar_t *,const wchar_t *);\r
+extern wchar_t * wcsstr(const wchar_t *,const wchar_t *);\r
+extern size_t wcsnlen(const wchar_t * s, size_t count);\r
+extern int wcsicmp(const wchar_t* cs,const wchar_t * ct);\r
+extern int wcsnicmp(const wchar_t* cs,const wchar_t * ct, size_t count);\r
+extern size_t wcscspn(const wchar_t *, const wchar_t *);\r
+extern size_t wcslen(const wchar_t *);\r
+extern size_t wcsspn(const wchar_t *, const wchar_t *);\r
+\r
+extern unsigned long wstrlen(PWSTR);\r
+WCHAR wtoupper(WCHAR c);\r
+WCHAR wtolower(WCHAR c);\r
+   \r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif \r
+\r
diff --git a/reactos/lib/crtdll/crtdll.def b/reactos/lib/crtdll/crtdll.def
new file mode 100644 (file)
index 0000000..f3d1bba
--- /dev/null
@@ -0,0 +1,715 @@
+;\r
+; crtdll.def\r
+;\r
+; Exports from crtdll.dll from Windows 95 SYSTEM directory. Hopefully this\r
+; should also work with the crtdll provided with Windows NT.\r
+;\r
+; Contributors:\r
+;  Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>\r
+;\r
+;  THIS SOFTWARE IS NOT COPYRIGHTED\r
+;\r
+;  This source code is offered for use in the public domain. You may\r
+;  use, modify or distribute it freely.\r
+;\r
+;  This code is distributed in the hope that it will be useful but\r
+;  WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY\r
+;  DISCLAMED. This includes but is not limited to warrenties of\r
+;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+;\r
+; $Revision: 1.1 $\r
+; $Author: dwelch $\r
+; $Date: 1999/01/04 23:01:18 $\r
+;\r
+; These three functions appear to be name mangled in some way, so GCC is\r
+; probably not going to be able to use them in any case.\r
+;\r
+;    ??2@YAPAXI@Z\r
+;    ??3@YAXPAX@Z\r
+;    ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z\r
+;\r
+; These are functions for which I have not yet written prototypes or\r
+; otherwise set up (they are still included below though unlike those\r
+; first three).\r
+;\r
+;    _CIacos\r
+;    _CIasin\r
+;    _CIatan\r
+;    _CIatan2\r
+;    _CIcos\r
+;    _CIcosh\r
+;    _CIexp\r
+;    _CIfmod\r
+;    _CIlog\r
+;    _CIlog10\r
+;    _CIpow\r
+;    _CIsin\r
+;    _CIsinh\r
+;    _CIsqrt\r
+;    _CItan\r
+;    _CItanh\r
+;    __dllonexit\r
+;    __mb_cur_max_dll\r
+;    __threadhandle\r
+;    __threadid\r
+;    _abnormal_termination\r
+;    _acmdln_dll\r
+;    _aexit_rtn_dll\r
+;    _amsg_exit\r
+;    _commit\r
+;    _commode_dll\r
+;    _cpumode_dll\r
+;    _ctype\r
+;    _daylight_dll\r
+;    _environ_dll\r
+;    _expand\r
+;    _fcloseall\r
+;    _filbuf\r
+;    _fileinfo_dll\r
+;    _flsbuf\r
+;    _flushall\r
+;    _fmode_dll\r
+;    _fpieee_flt\r
+;    _fsopen\r
+;    _ftol\r
+;    _getdiskfree\r
+;    _getdllprocaddr\r
+;    _getdrive\r
+;    _getdrives\r
+;    _getsystime\r
+;    _getw\r
+;    _initterm\r
+;    _ismbbalnum\r
+;    _ismbbalpha\r
+;    _ismbbgraph\r
+;    _ismbbkalnum\r
+;    _ismbbkana\r
+;    _ismbbkpunct\r
+;    _ismbblead\r
+;    _ismbbprint\r
+;    _ismbbpunct\r
+;    _ismbbtrail\r
+;    _ismbcalpha\r
+;    _ismbcdigit\r
+;    _ismbchira\r
+;    _ismbckata\r
+;    _ismbcl0\r
+;    _ismbcl1\r
+;    _ismbcl2\r
+;    _ismbclegal\r
+;    _ismbclower\r
+;    _ismbcprint\r
+;    _ismbcspace\r
+;    _ismbcsymbol\r
+;    _ismbcupper\r
+;    _ismbslead\r
+;    _ismbstrail\r
+;    _lfind\r
+;    _loaddll\r
+;    _lrotl\r
+;    _lrotr\r
+;    _lsearch\r
+;    _makepath\r
+;    _matherr\r
+;    _mbbtombc\r
+;    _mbbtype\r
+;    _mbccpy\r
+;    _mbcjistojms\r
+;    _mbcjmstojis\r
+;    _mbclen\r
+;    _mbctohira\r
+;    _mbctokata\r
+;    _mbctolower\r
+;    _mbctombb\r
+;    _mbctoupper\r
+;    _mbctype\r
+;    _mbsbtype\r
+;    _mbscat\r
+;    _mbscmp\r
+;    _mbscpy\r
+;    _mbscspn\r
+;    _mbsdec\r
+;    _mbsdup\r
+;    _mbsicmp\r
+;    _mbsinc\r
+;    _mbslen\r
+;    _mbslwr\r
+;    _mbsnbcat\r
+;    _mbsnbcmp\r
+;    _mbsnbcnt\r
+;    _mbsnbcpy\r
+;    _mbsnbicmp\r
+;    _mbsnbset\r
+;    _mbsnccnt\r
+;    _mbsncmp\r
+;    _mbsncpy\r
+;    _mbsnextc\r
+;    _mbsnicmp\r
+;    _mbsninc\r
+;    _mbsnset\r
+;    _mbspbrk\r
+;    _mbsrchr\r
+;    _mbsrev\r
+;    _mbsset\r
+;    _mbsspn\r
+;    _mbsspnp\r
+;    _mbsstr\r
+;    _mbstrlen\r
+;    _mbsupr\r
+;    _onexit\r
+;    _osver_dll\r
+;    _osversion_dll\r
+;    _pctype_dll\r
+;    _purecall\r
+;    _putw\r
+;    _pwctype_dll\r
+;    _rmtmp\r
+;    _rotl\r
+;    _rotr\r
+;    _setsystime\r
+;    _snprintf\r
+;    _snwprintf\r
+;    _splitpath\r
+;    _strdate\r
+;    _strdec\r
+;    _strinc\r
+;    _strncnt\r
+;    _strnextc\r
+;    _strninc\r
+;    _strspnp\r
+;    _strtime\r
+;    _tempnam\r
+;    _timezone_dll\r
+;    _tzname\r
+;    _tzset\r
+;    _ultoa\r
+;    _unloaddll\r
+;    _vsnprintf\r
+;    _vsnwprintf\r
+;    _winmajor_dll\r
+;    _winminor_dll\r
+;    _winver_dll\r
+;    _wtoi\r
+;    _wtol\r
+;\r
+EXPORTS\r
+_CIacos\r
+_CIasin\r
+_CIatan\r
+_CIatan2\r
+_CIcos\r
+_CIcosh\r
+_CIexp\r
+_CIfmod\r
+_CIlog\r
+_CIlog10\r
+_CIpow\r
+_CIsin\r
+_CIsinh\r
+_CIsqrt\r
+_CItan\r
+_CItanh\r
+_HUGE_dll\r
+_XcptFilter\r
+__GetMainArgs\r
+__argc_dll\r
+__argv_dll\r
+__dllonexit\r
+__doserrno\r
+__fpecode\r
+__isascii\r
+__iscsym\r
+__iscsymf\r
+__mb_cur_max_dll\r
+__pxcptinfoptrs\r
+__threadhandle\r
+__threadid\r
+__toascii\r
+_abnormal_termination\r
+_access\r
+_acmdln_dll\r
+_aexit_rtn_dll\r
+_amsg_exit\r
+_assert\r
+_basemajor_dll\r
+_baseminor_dll\r
+_baseversion_dll\r
+_beep\r
+_beginthread\r
+_c_exit\r
+_cabs\r
+_cexit\r
+_cgets\r
+_chdir\r
+_chdrive\r
+_chgsign\r
+_chmod\r
+_chsize\r
+_clearfp\r
+_close\r
+_commit\r
+_commode_dll\r
+_control87\r
+_controlfp\r
+_copysign\r
+_cprintf\r
+_cpumode_dll\r
+_cputs\r
+_creat\r
+_cscanf\r
+_ctype\r
+_cwait\r
+_daylight_dll\r
+_dup\r
+_dup2\r
+_ecvt\r
+_endthread\r
+_environ_dll\r
+_eof\r
+_errno\r
+_except_handler2\r
+_execl\r
+_execle\r
+_execlp\r
+_execlpe\r
+_execv\r
+_execve\r
+_execvp\r
+_execvpe\r
+_exit\r
+_expand\r
+_fcloseall\r
+_fcvt\r
+_fdopen\r
+_fgetchar\r
+_fgetwchar\r
+_filbuf\r
+_fileinfo_dll\r
+_filelength\r
+_fileno\r
+_findclose\r
+_findfirst\r
+_findnext\r
+_finite\r
+_flsbuf\r
+_flushall\r
+_fmode_dll\r
+_fpclass\r
+_fpieee_flt\r
+_fpreset\r
+_fputchar\r
+_fputwchar\r
+_fsopen\r
+_fstat\r
+_ftime\r
+_ftol\r
+_fullpath\r
+_futime\r
+_gcvt\r
+_get_osfhandle\r
+_getch\r
+_getche\r
+_getcwd\r
+_getdcwd\r
+_getdiskfree\r
+_getdllprocaddr\r
+_getdrive\r
+_getdrives\r
+_getpid\r
+_getsystime\r
+_getw\r
+_global_unwind2\r
+_heapchk\r
+_heapmin\r
+_heapset\r
+_heapwalk\r
+_hypot\r
+_initterm\r
+_iob\r
+_isatty\r
+_isctype\r
+_ismbbalnum\r
+_ismbbalpha\r
+_ismbbgraph\r
+_ismbbkalnum\r
+_ismbbkana\r
+_ismbbkpunct\r
+_ismbblead\r
+_ismbbprint\r
+_ismbbpunct\r
+_ismbbtrail\r
+_ismbcalpha\r
+_ismbcdigit\r
+_ismbchira\r
+_ismbckata\r
+_ismbcl0\r
+_ismbcl1\r
+_ismbcl2\r
+_ismbclegal\r
+_ismbclower\r
+_ismbcprint\r
+_ismbcspace\r
+_ismbcsymbol\r
+_ismbcupper\r
+_ismbslead\r
+_ismbstrail\r
+_isnan\r
+_itoa\r
+_j0\r
+_j1\r
+_jn\r
+_kbhit\r
+_lfind\r
+_loaddll\r
+_local_unwind2\r
+_locking\r
+_logb\r
+_lrotl\r
+_lrotr\r
+_lsearch\r
+_lseek\r
+_ltoa\r
+_makepath\r
+_matherr\r
+_mbbtombc\r
+_mbbtype\r
+_mbccpy\r
+_mbcjistojms\r
+_mbcjmstojis\r
+_mbclen\r
+_mbctohira\r
+_mbctokata\r
+_mbctolower\r
+_mbctombb\r
+_mbctoupper\r
+_mbctype\r
+_mbsbtype\r
+_mbscat\r
+_mbschr\r
+_mbscmp\r
+_mbscpy\r
+_mbscspn\r
+_mbsdec\r
+_mbsdup\r
+_mbsicmp\r
+_mbsinc\r
+_mbslen\r
+_mbslwr\r
+_mbsnbcat\r
+_mbsnbcmp\r
+_mbsnbcnt\r
+_mbsnbcpy\r
+_mbsnbicmp\r
+_mbsnbset\r
+_mbsncat\r
+_mbsnccnt\r
+_mbsncmp\r
+_mbsncpy\r
+_mbsnextc\r
+_mbsnicmp\r
+_mbsninc\r
+_mbsnset\r
+_mbspbrk\r
+_mbsrchr\r
+_mbsrev\r
+_mbsset\r
+_mbsspn\r
+_mbsspnp\r
+_mbsstr\r
+_mbstok\r
+_mbstrlen\r
+_mbsupr\r
+_memccpy\r
+_memicmp\r
+_mkdir\r
+_mktemp\r
+_msize\r
+_nextafter\r
+_onexit\r
+_open\r
+_open_osfhandle\r
+_osmajor_dll\r
+_osminor_dll\r
+_osmode_dll\r
+_osver_dll\r
+_osversion_dll\r
+_pclose\r
+_pctype_dll\r
+_pgmptr_dll\r
+_pipe\r
+_popen\r
+_purecall\r
+_putch\r
+_putenv\r
+_putw\r
+_pwctype_dll\r
+_read\r
+_rmdir\r
+_rmtmp\r
+_rotl\r
+_rotr\r
+_scalb\r
+_searchenv\r
+_seterrormode\r
+_setjmp\r
+_setmode\r
+_setsystime\r
+_sleep\r
+_snprintf\r
+_snwprintf\r
+_sopen\r
+_spawnl\r
+_spawnle\r
+_spawnlp\r
+_spawnlpe\r
+_spawnv\r
+_spawnve\r
+_spawnvp\r
+_spawnvpe\r
+_splitpath\r
+_stat\r
+_statusfp\r
+_strcmpi\r
+_strdate\r
+_strdec\r
+_strdup\r
+_strerror\r
+_stricmp\r
+_stricoll\r
+_strinc\r
+_strlwr\r
+_strncnt\r
+_strnextc\r
+_strnicmp\r
+_strninc\r
+_strnset\r
+_strrev\r
+_strset\r
+_strspnp\r
+_strtime\r
+_strupr\r
+_swab\r
+_sys_errlist\r
+_sys_nerr_dll\r
+_tell\r
+_tempnam\r
+_timezone_dll\r
+_tolower\r
+_toupper\r
+_tzname\r
+_tzset\r
+_ultoa\r
+_umask\r
+_ungetch\r
+_unlink\r
+_unloaddll\r
+_utime\r
+_vsnprintf\r
+_vsnwprintf\r
+_wcsdup\r
+_wcsicmp\r
+_wcsicoll\r
+_wcslwr\r
+_wcsnicmp\r
+_wcsnset\r
+_wcsrev\r
+_wcsset\r
+_wcsupr\r
+_winmajor_dll\r
+_winminor_dll\r
+_winver_dll\r
+_write\r
+_wtoi\r
+_wtol\r
+_y0\r
+_y1\r
+_yn\r
+abort\r
+abs\r
+acos\r
+asctime\r
+asin\r
+atan\r
+atan2\r
+atexit\r
+atof\r
+atoi\r
+atol\r
+bsearch\r
+calloc\r
+ceil\r
+clearerr\r
+clock\r
+cos\r
+cosh\r
+ctime\r
+difftime\r
+div\r
+exit\r
+exp\r
+fabs\r
+fclose\r
+feof\r
+ferror\r
+fflush\r
+fgetc\r
+fgetpos\r
+fgets\r
+fgetwc\r
+floor\r
+fmod\r
+fopen\r
+fprintf\r
+fputc\r
+fputs\r
+fputwc\r
+fread\r
+free\r
+freopen\r
+frexp\r
+fscanf\r
+fseek\r
+fsetpos\r
+ftell\r
+fwprintf\r
+fwrite\r
+fwscanf\r
+getc\r
+getchar\r
+getenv\r
+gets\r
+gmtime\r
+is_wctype\r
+isalnum\r
+isalpha\r
+iscntrl\r
+isdigit\r
+isgraph\r
+isleadbyte\r
+islower\r
+isprint\r
+ispunct\r
+isspace\r
+isupper\r
+iswalnum\r
+iswalpha\r
+iswascii\r
+iswcntrl\r
+iswctype\r
+iswdigit\r
+iswgraph\r
+iswlower\r
+iswprint\r
+iswpunct\r
+iswspace\r
+iswupper\r
+iswxdigit\r
+isxdigit\r
+labs\r
+ldexp\r
+ldiv\r
+localeconv\r
+localtime\r
+log\r
+log10\r
+longjmp\r
+malloc\r
+mblen\r
+mbstowcs\r
+mbtowc\r
+memchr\r
+memcmp\r
+memcpy\r
+memmove\r
+memset\r
+mktime\r
+modf\r
+perror\r
+pow\r
+printf\r
+putc\r
+putchar\r
+puts\r
+qsort\r
+raise\r
+rand\r
+realloc\r
+remove\r
+rename\r
+rewind\r
+scanf\r
+setbuf\r
+setlocale\r
+setvbuf\r
+signal\r
+sin\r
+sinh\r
+sprintf\r
+sqrt\r
+srand\r
+sscanf\r
+strcat\r
+strchr\r
+strcmp\r
+strcoll\r
+strcpy\r
+strcspn\r
+strerror\r
+strftime\r
+strlen\r
+strncat\r
+strncmp\r
+strncpy\r
+strpbrk\r
+strrchr\r
+strspn\r
+strstr\r
+strtod\r
+strtok\r
+strtol\r
+strtoul\r
+strxfrm\r
+swprintf\r
+swscanf\r
+system\r
+tan\r
+tanh\r
+time\r
+tmpfile\r
+tmpnam\r
+tolower\r
+toupper\r
+towlower\r
+towupper\r
+ungetc\r
+ungetwc\r
+vfprintf\r
+vfwprintf\r
+vprintf\r
+vsprintf\r
+vswprintf\r
+vwprintf\r
+wcscat\r
+wcschr\r
+wcscmp\r
+wcscoll\r
+wcscpy\r
+wcscspn\r
+wcsftime\r
+wcslen\r
+wcsncat\r
+wcsncmp\r
+wcsncpy\r
+wcspbrk\r
+wcsrchr\r
+wcsspn\r
+wcsstr\r
+wcstod\r
+wcstok\r
+wcstol\r
+wcstombs\r
+wcstoul\r
+wcsxfrm\r
+wctomb\r
+wprintf\r
+wscanf\r
index 83c73f4..8428531 100644 (file)
@@ -17,7 +17,7 @@ STDLIB_OBJECTS = stdlib/malloc.o
 OBJECTS = $(STRING_OBJECTS) $(STDIO_OBJECTS) $(STDLIB_OBJECTS)
 
 crtdll.a: $(OBJECTS)
-       $(AR) vrcs crtdll.a $(OBJECTS)
+       $(AR) rcs crtdll.a $(OBJECTS)
 
 dummy:
 
index b2b1de2..be924de 100644 (file)
@@ -2,15 +2,15 @@
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS system libraries
  * FILE:            lib/kernel32/file/create.c
- * PURPOSE:         Directory functions
+ * PURPOSE:         File create/open functions
  * PROGRAMMER:      Ariadne ( ariadne@xs4all.nl)
                  GetTempFileName is modified from WINE [ Alexandre Juiliard ]
*                 GetTempFileName is modified from WINE [ Alexandre Juiliard ]
  * UPDATE HISTORY:
  *                  Created 01/11/98
  */
 
+/* INCLUDES *****************************************************************/
 
-#undef WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #include <ddk/ntddk.h>
 #include <wstring.h>
 #include <kernel32/li.h>
 #include <ddk/rtl.h>
 
+#define NDEBUG
+#include <kernel32/kernel32.h>
+
+/* FUNCTIONS ****************************************************************/
+
 HANDLE STDCALL CreateFileA(LPCSTR lpFileName,
                           DWORD dwDesiredAccess,
                           DWORD dwShareMode,
@@ -30,7 +35,7 @@ HANDLE STDCALL CreateFileA(LPCSTR lpFileName,
    WCHAR FileNameW[MAX_PATH];
    ULONG i = 0;
    
-   OutputDebugStringA("CreateFileA\n");
+   DPRINT("CreateFileA\n");
    
    while ((*lpFileName)!=0 && i < MAX_PATH)
      {
@@ -69,7 +74,7 @@ HANDLE STDCALL CreateFileW(LPCWSTR lpFileName,
    UINT Len = 0;
    WCHAR CurrentDir[MAX_PATH];
    
-   OutputDebugStringA("CreateFileW\n");
+   DPRINT("CreateFileW\n");
    
    if (!(dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED))
      {
@@ -83,16 +88,16 @@ HANDLE STDCALL CreateFileW(LPCWSTR lpFileName,
    PathNameW[3] = '\\';
    PathNameW[4] = 0;
    
-   dprintf("Name %w\n",PathNameW);
+   DPRINT("Name %w\n",PathNameW);
    if (lpFileName[0] != L'\\' && lpFileName[1] != L':')     
      {
        Len =  GetCurrentDirectoryW(MAX_PATH,CurrentDir);
-       dprintf("CurrentDir %w\n",CurrentDir);
+       DPRINT("CurrentDir %w\n",CurrentDir);
        lstrcatW(PathNameW,CurrentDir);
-       dprintf("Name %w\n",PathNameW);
+       DPRINT("Name %w\n",PathNameW);
      }
    lstrcatW(PathNameW,lpFileName);
-   dprintf("Name %w\n",PathNameW);
+   DPRINT("Name %w\n",PathNameW);
      
    FileNameString.Length = lstrlenW( PathNameW)*sizeof(WCHAR);
         
index 0f4698d..7f59a1c 100644 (file)
@@ -3,7 +3,6 @@
  * PROJECT:         ReactOS system libraries
  * FILE:            lib/kernel32/file/curdir.c
  * PURPOSE:         Current directory functions
- * PROGRAMMER:      David Welch (welch@mcmail.com)
  * UPDATE HISTORY:
  *                  Created 30/09/98
  */
@@ -13,6 +12,9 @@
 
 #include <windows.h>
 
+#define NDEBUG
+#include <kernel32/kernel32.h>
+
 /* GLOBALS *******************************************************************/
 
 
@@ -46,7 +48,7 @@ DWORD STDCALL GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer)
 {
    UINT uSize;
    
-   dprintf("CurrentDirectoryW %w\n",CurrentDirectoryW);
+   DPRINT("CurrentDirectoryW %w\n",CurrentDirectoryW);
    
    if ( lpBuffer == NULL ) 
        return 0;
@@ -54,7 +56,7 @@ DWORD STDCALL GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer)
    if ( nBufferLength > uSize )
        lstrcpynW(lpBuffer,CurrentDirectoryW,uSize);
    
-   dprintf("GetCurrentDirectoryW() = %w\n",lpBuffer);
+   DPRINT("GetCurrentDirectoryW() = %w\n",lpBuffer);
    
    return uSize;
 }
@@ -63,7 +65,7 @@ BOOL STDCALL SetCurrentDirectoryA(LPCSTR lpPathName)
 {
    UINT i;
 
-   dprintf("SetCurrentDirectoryA(lpPathName %s)\n",lpPathName);
+   DPRINT("SetCurrentDirectoryA(lpPathName %s)\n",lpPathName);
    
    if ( lpPathName == NULL )
        return FALSE;
@@ -77,17 +79,13 @@ BOOL STDCALL SetCurrentDirectoryA(LPCSTR lpPathName)
    }
    CurrentDirectoryW[i] = 0;
    
-   dprintf("CurrentDirectoryW = '%w'\n",CurrentDirectoryW);
+   DPRINT("CurrentDirectoryW = '%w'\n",CurrentDirectoryW);
    
    return(TRUE);
 }
 
 
-WINBOOL
-STDCALL
-SetCurrentDirectoryW(
-    LPCWSTR lpPathName
-    )
+WINBOOL STDCALL SetCurrentDirectoryW(LPCWSTR lpPathName)
 {
    if ( lpPathName == NULL )
        return FALSE;
index 083f912..026f0d3 100644 (file)
@@ -14,6 +14,9 @@
 #include <wstring.h>\r
 #include <ddk/ntddk.h>\r
 \r
+#define NDEBUG\r
+#include <kernel32/kernel32.h>\r
+\r
 /* TYPES ********************************************************************/\r
 \r
 typedef struct _KERNEL32_FIND_FILE_DATA\r
@@ -74,7 +77,7 @@ WINBOOL STDCALL InternalFindNextFile(HANDLE hFindFile,
                                  TRUE,\r
                                  &(IData->PatternStr),\r
                                  FALSE);\r
-   dprintf("Found %w\n",IData->FileInfo.FileName);\r
+   DPRINT("Found %w\n",IData->FileInfo.FileName);\r
    lpFindFileData->dwFileAttributes = IData->FileInfo.FileAttributes;\r
    if (Status != STATUS_SUCCESS)\r
    {\r
@@ -95,7 +98,7 @@ HANDLE STDCALL InternalFindFirstFile(LPCWSTR lpFileName,
    UNICODE_STRING DirectoryNameStr;\r
    IO_STATUS_BLOCK IoStatusBlock;\r
    \r
-   dprintf("FindFirstFileW(lpFileName %w, lpFindFileData %x)\n",\r
+   DPRINT("FindFirstFileW(lpFileName %w, lpFindFileData %x)\n",\r
           lpFileName, lpFindFileData);\r
    \r
    GetCurrentDirectoryW(MAX_PATH, CurrentDirectory);\r
@@ -104,17 +107,17 @@ HANDLE STDCALL InternalFindFirstFile(LPCWSTR lpFileName,
    Directory[2] = '?';\r
    Directory[3] = '\\';\r
    Directory[4] = 0;\r
-   dprintf("Directory %w\n",Directory);\r
+   DPRINT("Directory %w\n",Directory);\r
    wcscat(Directory, CurrentDirectory);\r
-   dprintf("Directory %w\n",Directory);\r
+   DPRINT("Directory %w\n",Directory);\r
    wcscat(Directory, lpFileName);\r
-   dprintf("Directory %w\n",Directory);\r
+   DPRINT("Directory %w\n",Directory);\r
    End = wcsrchr(Directory, '\\');\r
    *End = 0;\r
    \r
    wcscpy(Pattern, End+1);\r
    \r
-   dprintf("Directory %w Pattern %w\n",Directory,Pattern);\r
+   DPRINT("Directory %w Pattern %w\n",Directory,Pattern);\r
    \r
    IData = HeapAlloc(GetProcessHeap(), \r
                     HEAP_ZERO_MEMORY, \r
@@ -151,7 +154,7 @@ HANDLE STDCALL InternalFindFirstFile(LPCWSTR lpFileName,
                        TRUE,\r
                         &(IData->PatternStr),\r
                        FALSE);\r
-   dprintf("Found %w\n",IData->FileInfo.FileName);\r
+   DPRINT("Found %w\n",IData->FileInfo.FileName);\r
    \r
    lpFindFileData->dwFileAttributes = IData->FileInfo.FileAttributes;\r
    return(IData);\r
index 053415c..36a3b62 100644 (file)
  * Put the type definitions of the heap in a seperate header. Boudewijn Dekker
  */
 
-#include <kernel32/proc.h>
+/* INCLUDES *****************************************************************/
+
+#define NDEBUG
 #include <kernel32/kernel32.h>
+
+#include <kernel32/proc.h>
 #include <kernel32/heap.h>
 #include <internal/string.h>
 
+/* GLOBALS ******************************************************************/
 
 static HEAP_BUCKET __HeapDefaultBuckets[]=
 {
@@ -46,6 +51,8 @@ static HEAP_BUCKET __HeapDefaultBuckets[]=
 
 PHEAP  __ProcessHeap = NULL;
 
+/* FUNCTIONS ****************************************************************/
+
 static BOOL   __HeapCommit(PHEAP pheap, LPVOID start, LPVOID end);
 static BOOL   __HeapDecommit(PHEAP pheap, LPVOID start, LPVOID end);
 static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag);
@@ -68,8 +75,8 @@ static PHEAP  __HeapPrepare(LPVOID base, ULONG minsize, ULONG maxsize,
 *********************************************************************/
 static BOOL __HeapCommit(PHEAP pheap, LPVOID start, LPVOID end)
 {
-   dprintf("__HeapCommit( 0x%lX, 0x%lX, 0x%lX)\n",
-           (ULONG) pheap, (ULONG) start, (ULONG) end);
+   DPRINT("__HeapCommit( 0x%lX, 0x%lX, 0x%lX)\n",
+         (ULONG) pheap, (ULONG) start, (ULONG) end);
 
    if(end >= pheap->LastBlock)
       pheap->LastBlock=end;
@@ -87,7 +94,7 @@ static BOOL __HeapCommit(PHEAP pheap, LPVOID start, LPVOID end)
 *********************************************************************/
 static BOOL __HeapDecommit(PHEAP pheap, LPVOID start, LPVOID end)
 {
-   dprintf("__HeapDecommit( 0x%lX, 0x%lX, 0x%lX)\n",
+   DPRINT("__HeapDecommit( 0x%lX, 0x%lX, 0x%lX)\n",
            (ULONG) pheap, (ULONG) start, (ULONG) end);
 #ifdef NOT
    __VirtualDump();
@@ -113,7 +120,7 @@ static LPVOID __HeapAlloc(PHEAP pheap, ULONG flags, ULONG size, ULONG tag)
    ULONG       freesize;
    ULONG       allocsize;
    
-   dprintf("__HeapAlloc(pheap %x, flags %x, size %d, tag %x)\n",
+   DPRINT("__HeapAlloc(pheap %x, flags %x, size %d, tag %x)\n",
           pheap,flags,size,tag);
    
    pfree=&(pheap->Start);
@@ -235,7 +242,7 @@ static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size)
     */
    if(size==0)
    {
-      dprintf("__HeapReAlloc: freeing memory\n");
+      DPRINT("__HeapReAlloc: freeing memory\n");
       __HeapFree(pheap, flags, pold);
       return NULL;
    }
@@ -251,7 +258,7 @@ static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size)
 #endif
    else if(newsize < allocsize )
    {
-      dprintf("__HeapReAlloc: shrinking memory\n");
+      DPRINT("__HeapReAlloc: shrinking memory\n");
       /* free remaining region of memory */
       prealloc->Size=size | HEAP_NORMAL_TAG;
       pnext=HEAP_NEXT(prealloc);
@@ -267,7 +274,7 @@ static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size)
    }
    else if(newsize == allocsize )
    {
-      dprintf("__HeapReAlloc: no changes\n");
+      DPRINT("__HeapReAlloc: no changes\n");
       /* nothing to do */
       prealloc->Size= size | HEAP_NORMAL_TAG;
       return pold;
@@ -280,7 +287,7 @@ static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size)
       if(((LPVOID) pnext< pheap->End)&& HEAP_ISFREE(pnext) &&
          (HEAP_SIZE(pnext) + HEAP_ADMIN_SIZE >=newsize-allocsize))
       {
-         dprintf("__HeapReAlloc: joining memory\n");
+         DPRINT("__HeapReAlloc: joining memory\n");
          oldsize=HEAP_SIZE(prealloc);
          prealloc->Size=size | HEAP_NORMAL_TAG;
 
@@ -304,7 +311,7 @@ static LPVOID __HeapReAlloc(PHEAP pheap, ULONG flags, LPVOID pold, DWORD size)
       {
          if((flags&HEAP_REALLOC_IN_PLACE_ONLY)==0)
          {
-            dprintf("__HeapReAlloc: allocating new memory\n");
+            DPRINT("__HeapReAlloc: allocating new memory\n");
             /* alloc a new piece of memory */
             oldsize=HEAP_SIZE(prealloc);
             pmem=__HeapAlloc(pheap, flags, size, HEAP_NORMAL_TAG);
@@ -590,7 +597,7 @@ PHEAP __HeapPrepare(LPVOID base, ULONG minsize, ULONG maxsize,  ULONG flags)
 {
    PHEAP pheap=(PHEAP) base;
    
-   dprintf("__HeapPrepare(base %x, minsize %d, maxsize %d, flags %x)\n",
+   DPRINT("__HeapPrepare(base %x, minsize %d, maxsize %d, flags %x)\n",
           base,minsize,maxsize,flags);
    
    pheap->Magic=MAGIC_HEAP;
@@ -670,7 +677,7 @@ LPVOID STDCALL HeapAlloc(HANDLE hheap, DWORD flags, DWORD size)
    PHEAP    pheap=hheap;
    LPVOID   retval;
 
-   aprintf("HeapAlloc( 0x%lX, 0x%lX, 0x%lX )\n",
+   DPRINT("HeapAlloc( 0x%lX, 0x%lX, 0x%lX )\n",
            (ULONG) hheap, flags, (ULONG) size );
 #ifdef NOT
    HeapValidate(hheap, 0, 0);
@@ -686,7 +693,7 @@ LPVOID STDCALL HeapAlloc(HANDLE hheap, DWORD flags, DWORD size)
    if( (flags | pheap->Flags) & HEAP_NO_SERIALIZE )
       LeaveCriticalSection(&(pheap->Synchronize));
 
-   aprintf("HeapAlloc returns 0x%lX\n", (ULONG) retval);
+   DPRINT("HeapAlloc returns 0x%lX\n", (ULONG) retval);
    return retval;
 
 }
@@ -700,7 +707,7 @@ LPVOID STDCALL HeapReAlloc(HANDLE hheap, DWORD flags, LPVOID ptr, DWORD size)
    PHEAP_BLOCK      pfree=((PHEAP_BLOCK)ptr-1);
    LPVOID           retval;
 
-   aprintf("HeapReAlloc( 0x%lX, 0x%lX, 0x%lX, 0x%lX )\n",
+   DPRINT("HeapReAlloc( 0x%lX, 0x%lX, 0x%lX, 0x%lX )\n",
            (ULONG) hheap, flags, (ULONG) ptr, size );
 #ifdef NOT
    HeapValidate(hheap, 0, 0);
@@ -730,7 +737,7 @@ WINBOOL STDCALL HeapFree(HANDLE hheap, DWORD flags, LPVOID ptr)
    PHEAP_BLOCK      pfree=(PHEAP_BLOCK)((LPVOID)ptr-HEAP_ADMIN_SIZE);
    BOOL             retval;
 
-   aprintf("HeapFree( 0x%lX, 0x%lX, 0x%lX )\n",
+   DPRINT("HeapFree( 0x%lX, 0x%lX, 0x%lX )\n",
            (ULONG) hheap, flags, (ULONG) ptr );
 #ifdef NOT
    HeapValidate(hheap, 0, 0);
@@ -756,7 +763,7 @@ WINBOOL STDCALL HeapFree(HANDLE hheap, DWORD flags, LPVOID ptr)
 *********************************************************************/
 HANDLE WINAPI GetProcessHeap(VOID)
 {
-   aprintf("GetProcessHeap()\n");
+   DPRINT("GetProcessHeap()\n");
    return (HANDLE) __ProcessHeap;
 }
 
@@ -771,7 +778,7 @@ DWORD WINAPI GetProcessHeaps(DWORD maxheaps, PHANDLE phandles )
    DWORD retval;
    PHEAP pheap;
 
-   aprintf("GetProcessHeaps( %u, 0x%lX )\n", maxheaps, (ULONG) phandles );
+   DPRINT("GetProcessHeaps( %u, 0x%lX )\n", maxheaps, (ULONG) phandles );
 
    pheap= __ProcessHeap;
    retval=0;
@@ -801,7 +808,7 @@ BOOL WINAPI HeapLock(HANDLE hheap)
 {
    PHEAP pheap=hheap;
 
-   aprintf("HeapLock( 0x%lX )\n", (ULONG) hheap );
+   DPRINT("HeapLock( 0x%lX )\n", (ULONG) hheap );
 
    EnterCriticalSection(&(pheap->Synchronize));
    return TRUE;
@@ -815,7 +822,7 @@ BOOL WINAPI HeapUnlock(HANDLE hheap)
 {
    PHEAP pheap=hheap;
 
-   aprintf("HeapUnlock( 0x%lX )\n", (ULONG) hheap );
+   DPRINT("HeapUnlock( 0x%lX )\n", (ULONG) hheap );
 
    LeaveCriticalSection(&(pheap->Synchronize));
    return TRUE;
@@ -866,7 +873,7 @@ DWORD WINAPI HeapSize(HANDLE hheap, DWORD flags, LPCVOID pmem)
    PHEAP_BLOCK palloc=((PHEAP_BLOCK)pmem-1);
    DWORD       retval=0;
 
-   aprintf("HeapSize( 0x%lX, 0x%lX, 0x%lX )\n",
+   DPRINT("HeapSize( 0x%lX, 0x%lX, 0x%lX )\n",
            (ULONG) hheap, flags, (ULONG) pmem );
 
    if(pheap->Magic!=MAGIC_HEAP)
@@ -924,7 +931,7 @@ BOOL WINAPI HeapValidate(HANDLE hheap, DWORD flags, LPCVOID pmem)
          pnext=HEAP_NEXT(pcheck);
          if((pprev)&&(HEAP_PREV(pcheck)!=pprev))
          {
-            dprintf("HeapValidate: linked list invalid, region 0x%lX,"
+            DPRINT("HeapValidate: linked list invalid, region 0x%lX,"
                     " previous region 0x%lX, list says 0x%lX\n",
                      (ULONG)pcheck, (ULONG)pprev, (ULONG) HEAP_PREV(pcheck));
             return FALSE;
@@ -948,13 +955,13 @@ BOOL WINAPI HeapValidate(HANDLE hheap, DWORD flags, LPCVOID pmem)
                pnextfrag=(PHEAP_FRAGMENT)((LPVOID)pfrag+add);
                if(pfrag->Magic!=HEAP_FRAG_MAGIC)
                {
-                  dprintf("HeapValidate: fragment %d magic invalid, region 0x%lX,"
+                  DPRINT("HeapValidate: fragment %d magic invalid, region 0x%lX,"
                           " previous region 0x%lX\n", i, (ULONG)pcheck, (ULONG)pprev);
                   return FALSE;
                }
                if(pfrag->Number!=i)
                {
-                  dprintf("HeapValidate: fragment %d number invalid, region 0x%lX,"
+                  DPRINT("HeapValidate: fragment %d number invalid, region 0x%lX,"
                           " previous region 0x%lX\n", i, (ULONG)pcheck, (ULONG)pprev);
                   return FALSE;
                }
@@ -962,7 +969,7 @@ BOOL WINAPI HeapValidate(HANDLE hheap, DWORD flags, LPCVOID pmem)
                   number++;
                if(pfrag->Sub!=psub)
                {
-                  dprintf("HeapValidate: fragment %d suballoc invalid, region 0x%lX,"
+                  DPRINT("HeapValidate: fragment %d suballoc invalid, region 0x%lX,"
                           " previous region 0x%lX\n", i, (ULONG)pcheck, (ULONG)pprev);
                   return FALSE;
                }
@@ -971,11 +978,11 @@ BOOL WINAPI HeapValidate(HANDLE hheap, DWORD flags, LPCVOID pmem)
             }
             if(number!=psub->NumberFree)
             {
-               dprintf("HeapValidate: invalid number of free fragments, region 0x%lX,"
+               DPRINT("HeapValidate: invalid number of free fragments, region 0x%lX,"
                        " previous region 0x%lX\n", (ULONG)pcheck, (ULONG)pprev);
                return FALSE;
             }
-            dprintf("HeapValidate: [0x%08lX-0x%08lX] suballocated,"
+            DPRINT("HeapValidate: [0x%08lX-0x%08lX] suballocated,"
                     " bucket size=%d, bitmap=0x%08lX\n",
                     (ULONG) pcheck, (ULONG) pnext, pbucket->Size, psub->Bitmap);
          }
@@ -983,22 +990,22 @@ BOOL WINAPI HeapValidate(HANDLE hheap, DWORD flags, LPCVOID pmem)
          {
             if(HEAP_RSIZE(pcheck)!=HEAP_SIZE(pcheck))
             {
-               dprintf("HeapValidate: invalid size of free region 0x%lX,"
+               DPRINT("HeapValidate: invalid size of free region 0x%lX,"
                        " previous region 0x%lX\n",
                        (ULONG) pcheck, (ULONG) pprev);
                return FALSE;
             }
-            dprintf("HeapValidate: [0x%08lX-0x%08lX] free\n",
+            DPRINT("HeapValidate: [0x%08lX-0x%08lX] free\n",
                     (ULONG) pcheck, (ULONG) pnext );
          }
          else if(HEAP_ISNORMAL(pcheck))
          {
-            dprintf("HeapValidate: [0x%08lX-0x%08lX] allocated\n",
+            DPRINT("HeapValidate: [0x%08lX-0x%08lX] allocated\n",
                     (ULONG) pcheck, (ULONG) pnext );
          }
          else
          {
-            dprintf("HeapValidate: invalid tag %x, region 0x%lX,"
+            DPRINT("HeapValidate: invalid tag %x, region 0x%lX,"
                     " previous region 0x%lX\n", pcheck->Size>>28,
                      (ULONG)pcheck, (ULONG)pprev);
             return FALSE;
index 9ca717d..3d2e37a 100644 (file)
@@ -1,11 +1,13 @@
 #include <windows.h>
+
+#define NDEBUG
 #include <kernel32/kernel32.h>
 
 VOID CopyMemory(PVOID Destination, CONST VOID* Source, DWORD Length)
 {
    DWORD i;
    
-   dprintf("CopyMemory(Destination %x, Source %x, Length %d)\n",
+   DPRINT("CopyMemory(Destination %x, Source %x, Length %d)\n",
           Destination,Source,Length);
    
    for (i=0; i<Length; i++)
index 401858a..ebba942 100644 (file)
@@ -584,19 +584,9 @@ FlushInstructionCache(
        return TRUE;
 }
 
-VOID
-STDCALL
-ExitProcess(
-           UINT uExitCode
-           ) 
-{
-       
-       NtTerminateProcess(
-               NtCurrentProcess() ,
-               uExitCode
-       );
-       
-
+VOID STDCALL ExitProcess(UINT uExitCode) 
+{      
+   NtTerminateProcess(NtCurrentProcess() ,uExitCode);
 }
 
 VOID
index cdfe761..354ae35 100644 (file)
@@ -172,33 +172,33 @@ WaitForSingleObject(
        return WaitForSingleObjectEx(hHandle,dwMilliseconds,FALSE);     
 }
 
-DWORD 
-STDCALL
-WaitForSingleObjectEx(
-    HANDLE  hHandle,   
-    DWORD  dwMilliseconds,     
-    BOOL  bAlertable   
-   )
+DWORD STDCALL WaitForSingleObjectEx(HANDLE  hHandle,   
+                                   DWORD  dwMilliseconds,      
+                                   BOOL  bAlertable)
 {
-
-       NTSTATUS  errCode;
-       LARGE_INTEGER Time;
-       DWORD retCode;
-
+   
+   NTSTATUS  errCode;
+   PLARGE_INTEGER TimePtr;
+   LARGE_INTEGER Time;
+   DWORD retCode;
+   
+   if (dwMilliseconds == INFINITE)
+     {
+       TimePtr = NULL;
+     }
+   else
+     {
        SET_LARGE_INTEGER_LOW_PART(Time,dwMilliseconds);
+       TimePtr = &Time;
+     }
 
-       errCode = NtWaitForSingleObject(
-        hHandle,
-       (BOOLEAN) bAlertable,
-       &Time
-       );
-
-       retCode = RtlNtStatusToDosError(errCode);
-       SetLastError(retCode);
-       return retCode;
-       
-
-       
+   errCode = NtWaitForSingleObject(hHandle,
+                                  (BOOLEAN) bAlertable,
+                                  TimePtr);
+   
+   retCode = RtlNtStatusToDosError(errCode);
+   SetLastError(retCode);
+   return retCode;
 }
 
 DWORD 
@@ -243,4 +243,4 @@ WaitForMultipleObjectsEx(
        return retCode;
        
 
-}
\ No newline at end of file
+}
index 7c8236e..c4f6960 100644 (file)
@@ -257,16 +257,22 @@ asmlinkage void exception_handler(unsigned int edi,
 
 VOID KeDumpStackFrames(ULONG DummyArg)
 {
-   PULONG Stack = ((PULONG)&DummyArg)[-1];
+   PULONG Stack = &((&DummyArg)[-1]);
    ULONG i;
    
+   Stack = (PVOID)(((ULONG)Stack) & (~0x3));
+   
    DbgPrint("Frames:\n");
-   for (i=0; i<32; i++)
+   for (i=0; i<1024; i++)
      {
-       if (Stack[i] > KERNEL_BASE)
+       if (Stack[i] > KERNEL_BASE && Stack[i] < ((ULONG)&etext))
          {
             DbgPrint("%.8x  ",Stack[i]);
          }
+       if (Stack[i] == 0xceafbeef)
+         {
+            DbgPrint("IRQ ");
+         }
      }
    DbgPrint("\n");
 }
index eb6220b..90fe1dd 100644 (file)
@@ -19,6 +19,9 @@ _irq_handler_%1:
         push    ds
        push    es
        
+       mov     eax,0xceafbeef
+       push    eax
+       
        ;
        ; Load DS
        ;
@@ -45,6 +48,9 @@ _irq_handler_%1:
        ; Restore stack, registers and return to interrupted routine
        ;
         pop     eax
+       
+       pop     eax
+       
        pop     es
         pop     ds
         popa
@@ -59,12 +65,17 @@ _irq_handler_%1:
        ;
         pusha
         push ds
+       push es
+       
+       mov eax,0xceafbeef
+       push eax
        
        ;
        ; Load DS
        ;
         mov ax,KERNEL_DS
         mov ds,ax
+       mov es,ax
        
        ;
        ; Mask the related vector at the PIC
@@ -83,6 +94,10 @@ _irq_handler_%1:
        ; Restore stack, registers and return to the interrupted routine
        ;
         pop  eax
+       
+       pop  eax
+       
+       pop  es
         pop  ds
         popa
         iret
index 827d1c8..3e3aef4 100644 (file)
@@ -3,7 +3,7 @@
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/io/create.c
  * PURPOSE:         Handling file create/open apis
- * PROGRAMMER:      David Welch (welch@mcmail.com)
+ * PROGRAMMER:      David Welch (welch@cwcom.net) 
  * UPDATE HISTORY:
  *                  24/05/98: Created
  */
@@ -117,6 +117,7 @@ NTSTATUS ZwCreateFile(PHANDLE FileHandle,
    if (Status != STATUS_SUCCESS && Status != STATUS_FS_QUERY_REQUIRED)
      {
        DPRINT("%s() = Failed to find object\n",__FUNCTION__);
+       ObDereferenceObject(FileObject);
        ZwClose(*FileHandle);
        *FileHandle=0;
        return(STATUS_UNSUCCESSFUL);
@@ -134,7 +135,7 @@ NTSTATUS ZwCreateFile(PHANDLE FileHandle,
        FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN;
        FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool,
                                        ObjectAttributes->ObjectName->Length);
-       FileObject->FileName.Length = ObjectAttributes->Length;
+       FileObject->FileName.Length = ObjectAttributes->ObjectName->Length;
        RtlCopyUnicodeString(&(FileObject->FileName),
                             ObjectAttributes->ObjectName);
      }
@@ -146,7 +147,7 @@ NTSTATUS ZwCreateFile(PHANDLE FileHandle,
        if (DeviceObject->DeviceType != FILE_DEVICE_FILE_SYSTEM &&
            DeviceObject->DeviceType != FILE_DEVICE_DISK)
          {
-            CHECKPOINT;
+            ObDereferenceObject(FileObject);
             ZwClose(*FileHandle);
             *FileHandle=0;
             return(STATUS_UNSUCCESSFUL);
@@ -158,7 +159,7 @@ NTSTATUS ZwCreateFile(PHANDLE FileHandle,
             Status = IoTryToMountStorageDevice(DeviceObject);
             if (Status!=STATUS_SUCCESS)
               {
-                 CHECKPOINT;
+                 ObDereferenceObject(FileObject);
                  ZwClose(*FileHandle);
                  *FileHandle=0;
                  return(Status);
@@ -167,13 +168,13 @@ NTSTATUS ZwCreateFile(PHANDLE FileHandle,
          }
        DPRINT("Remainder %x\n",Remainder);
        DPRINT("Remainder %w\n",Remainder);
-       FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool,
-                                                    wstrlen(Remainder));
-       RtlInitUnicodeString(&(FileObject->FileName),Remainder);
+       DPRINT("FileObject->FileName.Buffer %w\n",FileObject->FileName.Buffer);
+       RtlInitUnicodeString(&(FileObject->FileName),wstrdup(Remainder));
        DPRINT("FileObject->FileName.Buffer %x %w\n",
               FileObject->FileName.Buffer,FileObject->FileName.Buffer);
      }
    CHECKPOINT;
+   DPRINT("FileObject->FileName.Buffer %x\n",FileObject->FileName.Buffer);
    
    if (CreateOptions & FILE_SYNCHRONOUS_IO_ALERT)
      {
@@ -194,6 +195,8 @@ NTSTATUS ZwCreateFile(PHANDLE FileHandle,
    Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
    if (Irp==NULL)
      {
+       ExFreePool(FileObject->FileName.Buffer);
+       ObDereferenceObject(FileObject);
        ZwClose(*FileHandle);
        *FileHandle=0;
        return(STATUS_UNSUCCESSFUL);
@@ -215,6 +218,9 @@ NTSTATUS ZwCreateFile(PHANDLE FileHandle,
    
    if (Status!=STATUS_SUCCESS)
      {
+       DPRINT("FileObject->FileName.Buffer %x\n",FileObject->FileName.Buffer);
+       ExFreePool(FileObject->FileName.Buffer);
+       ObDereferenceObject(FileObject);
        ZwClose(*FileHandle);
        *FileHandle=0;
      }
index bfe7e35..64a87ac 100644 (file)
@@ -58,9 +58,11 @@ NTSTATUS ZwReadFile(HANDLE FileHandle,
    PIO_STACK_LOCATION StackPtr;
    KEVENT Event;
    
+   assert(KeGetCurrentIrql()==PASSIVE_LEVEL);
+   
    DPRINT("ZwReadFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
          "IoStatusBlock %x)\n",
-         FileHandle,Buffer,Length,ByteOffset,IoStatusBlock);
+           FileHandle,Buffer,Length,ByteOffset,IoStatusBlock);
    
    Status = ObReferenceObjectByHandle(FileHandle,
                                      FILE_READ_DATA,
@@ -70,6 +72,8 @@ NTSTATUS ZwReadFile(HANDLE FileHandle,
                                      NULL);
    if (Status != STATUS_SUCCESS)
      {
+       DPRINT("ZwReadFile() =");
+       DbgPrintErrorMessage(Status);
        return(Status);
      }
    assert(FileObject != NULL);
index c169296..f0112e2 100644 (file)
@@ -33,7 +33,8 @@ NTSTATUS IoInitializeTimer(PDEVICE_OBJECT DeviceObject,
 {
    DeviceObject->Timer = ExAllocatePool(NonPagedPool,sizeof(IO_TIMER));
    KeInitializeTimer(&(DeviceObject->Timer->timer));
-   KeInitializeDpc(&(DeviceObject->Timer->dpc),(PKDEFERRED_ROUTINE)TimerRoutine,Context);
+   KeInitializeDpc(&(DeviceObject->Timer->dpc),
+                  (PKDEFERRED_ROUTINE)TimerRoutine,Context);
    
    return(STATUS_SUCCESS);
 }
index eb42af0..15a5b4c 100644 (file)
@@ -21,7 +21,10 @@ VOID KiDispatchInterrupt(ULONG irq)
  * level than DISPATCH_LEVEL
  */
 {
-   KeExpireTimers();
+   if (irq == 0)
+     {
+       KeExpireTimers();
+     }
    KeDrainDpcQueue();
    PsDispatchThread();
 }
index ce73885..a75006f 100644 (file)
@@ -54,7 +54,9 @@ void KeDrainDpcQueue(void)
    PLIST_ENTRY current_entry;
    PKDPC current;
    KIRQL oldlvl;
-  
+   
+   DPRINT("KeDrainDpcQueue()\n");
+   
    KeAcquireSpinLockAtDpcLevel(&DpcQueueLock);
    KeRaiseIrql(HIGH_LEVEL,&oldlvl);
    current_entry = RemoveHeadList(&DpcQueueHead);
index 47ca7ad..8b2ec20 100644 (file)
@@ -146,16 +146,20 @@ NTSTATUS STDCALL ZwQueryPerformanceCounter(IN PLARGE_INTEGER Counter,
 }
 
 
-NTSTATUS 
-KeAddThreadTimeout(PKTHREAD Thread, PLARGE_INTEGER Interval)
+NTSTATUS KeAddThreadTimeout(PKTHREAD Thread, PLARGE_INTEGER Interval)
 {
-  assert(Thread != NULL);
-  assert(Interval != NULL);
+   assert(Thread != NULL);
+   assert(Interval != NULL);
 
-  KeInitializeTimer(&(Thread->TimerBlock));
-  KeSetTimer(&(Thread->TimerBlock),*Interval,NULL);
+   DPRINT("KeAddThreadTimeout(Thread %x, Interval %x)\n",Thread,Interval);
+   
+   KeInitializeTimer(&(Thread->TimerBlock));
+   KeSetTimer(&(Thread->TimerBlock),*Interval,NULL);
 
-  return STATUS_SUCCESS;
+   DPRINT("Thread->TimerBlock.entry.Flink %x\n",
+           Thread->TimerBlock.entry.Flink);
+   
+   return STATUS_SUCCESS;
 }
 
 
@@ -327,6 +331,8 @@ BOOLEAN KeSetTimerEx(PKTIMER Timer, LARGE_INTEGER DueTime, LONG Period,
 {
    KIRQL oldlvl;
    
+   DPRINT("KeSetTimerEx(Timer %x)\n",Timer);
+   
    KeAcquireSpinLock(&timer_list_lock,&oldlvl);
    
    Timer->dpc=Dpc;
@@ -346,9 +352,11 @@ BOOLEAN KeSetTimerEx(PKTIMER Timer, LARGE_INTEGER DueTime, LONG Period,
    if (Timer->running)
      {
        KeReleaseSpinLock(&timer_list_lock,oldlvl);
-
        return TRUE;    
      }
+   DPRINT("Inserting %x in list\n",&Timer->entry);
+   DPRINT("Timer->entry.Flink %x\n",Timer->entry.Flink);
+   Timer->running=TRUE;
    InsertTailList(&timer_list_head,&Timer->entry);
    KeReleaseSpinLock(&timer_list_lock,oldlvl);
    
@@ -366,13 +374,17 @@ BOOLEAN KeCancelTimer(PKTIMER Timer)
 {
    KIRQL oldlvl;
    
+   DPRINT("KeCancelTimer(Timer %x)\n",Timer);
+   
    KeAcquireSpinLock(&timer_list_lock,&oldlvl);
                     
    if (!Timer->running)
      {
+       KeReleaseSpinLock(&timer_list_lock,oldlvl);
        return FALSE;
      }
    RemoveEntryList(&Timer->entry);
+   Timer->running = FALSE;
    KeReleaseSpinLock(&timer_list_lock,oldlvl);
 
    return TRUE;
@@ -423,6 +435,7 @@ VOID KeQueryTickCount(PLARGE_INTEGER TickCount)
 
 static void HandleExpiredTimer(PKTIMER current)
 {
+   DPRINT("HandleExpiredTime(current %x)\n",current);
    if (current->dpc!=NULL)
      {
        DPRINT("current->dpc->DeferredRoutine %x\n",
@@ -431,6 +444,7 @@ static void HandleExpiredTimer(PKTIMER current)
                                      current->dpc->DeferredContext,
                                      current->dpc->SystemArgument1,
                                      current->dpc->SystemArgument2);
+       DPRINT("Finished dpc routine\n");
      }
    current->signaled=TRUE;
    if (current->period != 0)
@@ -456,6 +470,12 @@ void KeExpireTimers(void)
    PKTIMER current = CONTAINING_RECORD(current_entry,KTIMER,entry);
    KIRQL oldlvl;
    
+   DPRINT("KeExpireTimers()\n");
+   DPRINT("&timer_list_head %x\n",&timer_list_head);
+   DPRINT("current_entry %x\n",current_entry);
+   DPRINT("current_entry->Flink %x\n",current_entry->Flink);
+   DPRINT("current_entry->Flink->Flink %x\n",current_entry->Flink->Flink);
+   
    KeAcquireSpinLock(&timer_list_lock,&oldlvl);
    
    while (current_entry!=(&timer_list_head))
@@ -469,6 +489,7 @@ void KeExpireTimers(void)
        current = CONTAINING_RECORD(current_entry,KTIMER,entry);
      }
    KeReleaseSpinLock(&timer_list_lock,oldlvl);
+   DPRINT("Finished KeExpireTimers()\n");
 }
 
 extern unsigned int nr_used_blocks;
@@ -511,8 +532,9 @@ BOOLEAN KiTimerInterrupt(VOID)
      }
 //   sprintf(str,"%.8u %.8u",EiFreeNonPagedPool,ticks);
    memset(str, 0, sizeof(str));
-   sprintf(str,"%.8u %.8u",EiNrUsedBlocks,KiTimerTicks);
+//   sprintf(str,"%.8u %.8u",EiNrUsedBlocks,KiTimerTicks);
 //   sprintf(str,"%.8u %.8u",EiFreeNonPagedPool,EiUsedNonPagedPool);
+   sprintf(str,"%.8u %.8u",PiNrThreads,KiTimerTicks);
    for (i=0;i<17;i++)
      {
        *vidmem=str[i];
index 474b292..a68b24f 100644 (file)
@@ -176,6 +176,11 @@ NTSTATUS KeWaitForSingleObject(PVOID Object,
 //          hdr->WaitListHead.Flink,hdr->WaitListHead.Blink);
    KeReleaseDispatcherDatabaseLock(FALSE);
    PsSuspendThread(PsGetCurrentThread());
+   
+   if (Timeout!=NULL)
+     {
+       KeCancelTimer(&KeGetCurrentThread()->TimerBlock);
+     }
    return(STATUS_SUCCESS);
 }
 
index c59f3d1..ae44671 100644 (file)
@@ -28,7 +28,7 @@
 #include <ddk/ntddk.h>\r
 \r
 \r
-#if 1\r
+#if 0\r
 #define VALIDATE_POOL validate_kernel_pool()\r
 #else\r
 #define VALIDATE_POOL\r
@@ -99,7 +99,8 @@ static void validate_free_list(void)
 \r
        if (current->magic != BLOCK_HDR_MAGIC)\r
          {\r
-            DbgPrint("Bad block magic (probable pool corruption)\n");\r
+            DbgPrint("Bad block magic (probable pool corruption) at %x\n",\r
+                     current);\r
             KeBugCheck(KBUG_POOL_FREE_LIST_CORRUPT);\r
          }\r
        \r
@@ -146,7 +147,8 @@ static void validate_used_list(void)
        \r
        if (current->magic != BLOCK_HDR_MAGIC)\r
          {\r
-            DbgPrint("Bad block magic (probable pool corruption)\n");\r
+            DbgPrint("Bad block magic (probable pool corruption) at %x\n",\r
+                     current);\r
             KeBugCheck(KBUG_POOL_FREE_LIST_CORRUPT);\r
          }\r
        if (base_addr < (kernel_pool_base) ||\r
@@ -189,7 +191,8 @@ static void check_duplicates(block_hdr* blk)
      {\r
        if (current->magic != BLOCK_HDR_MAGIC)\r
          {\r
-            DbgPrint("Bad block magic (probable pool corruption)\n");\r
+            DbgPrint("Bad block magic (probable pool corruption) at %x\n",\r
+                     current);\r
             KeBugCheck(KBUG_POOL_FREE_LIST_CORRUPT);\r
          }\r
 \r
@@ -538,8 +541,8 @@ asmlinkage VOID ExFreePool(PVOID block)
    \r
    if (blk->magic != BLOCK_HDR_MAGIC)\r
      {\r
-       DbgPrint("ExFreePool of non-allocated address\n");\r
-       for(;;);\r
+       DbgPrint("ExFreePool of non-allocated address %x\n",block);\r
+       KeBugCheck(0);\r
        return;\r
      }\r
    \r
@@ -622,7 +625,8 @@ PVOID ExAllocateNonPagedPoolWithTag(ULONG type, ULONG size, ULONG Tag)
               current->next);\r
        if (current->magic != BLOCK_HDR_MAGIC)\r
          {\r
-            DbgPrint("Bad block magic (probable pool corruption)\n");\r
+            DbgPrint("Bad block magic (probable pool corruption) at %x\n",\r
+                     current);\r
             KeBugCheck(KBUG_POOL_FREE_LIST_CORRUPT);\r
          }\r
        if (current->size>=size)\r
index ff0cd38..a5717bd 100644 (file)
@@ -95,6 +95,9 @@ PVOID ObGenericCreateObject(PHANDLE Handle,
                            ACCESS_MASK DesiredAccess,\r
                            POBJECT_ATTRIBUTES ObjectAttributes,\r
                            POBJECT_TYPE Type)\r
+/*\r
+ * FUNCTION: Creates a new object\r
+ */\r
 {\r
    POBJECT_HEADER hdr = NULL;\r
    PWSTR path;\r
@@ -206,13 +209,12 @@ VOID ObInitializeObjectHeader(POBJECT_TYPE Type, PWSTR name,
  */\r
 {\r
    PWSTR temp_name;\r
-   extern unsigned long long ticks;\r
    \r
    DPRINT("ObInitializeObjectHeader(id %x name %w obj %x)\n",Type,\r
          name,ObjectHeader);\r
 \r
-   ObjectHeader->HandleCount = 0;\r
-   ObjectHeader->RefCount = 0;\r
+   ObjectHeader->HandleCount = 1;\r
+   ObjectHeader->RefCount = 1;\r
    ObjectHeader->ObjectType = Type;\r
    ObjectHeader->Permanent = FALSE;\r
    if (name==NULL)\r
index d156ecf..da3d004 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <ddk/ntddk.h>
 
+#define NDEBUG
 #include <internal/debug.h>
 
 /* GLOBALS *******************************************************************/
@@ -27,7 +28,7 @@ static VOID PsIdleThreadMain(PVOID Context)
    
    for(;;)
      {
-//        DbgPrint("Idling.... ");
+        DPRINT("Idling.... DpcQueueSize %d\n",DpcQueueSize);
        if (DpcQueueSize > 0)
          {
             KeRaiseIrql(DISPATCH_LEVEL,&oldlvl);
index 7e021da..c547edd 100644 (file)
-/*
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS kernel
- * FILE:            ntoskrnl/ps/kill.c
- * PURPOSE:         Terminating a thread
- * PROGRAMMER:      David Welch (welch@mcmail.com)
- * UPDATE HISTORY:
- *                  Created 22/05/98
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <ddk/ntddk.h>
-#include <internal/ps.h>
-
-#define NDEBUG
-#include <internal/debug.h>
-
-/* GLBOALS *******************************************************************/
-
-extern ULONG PiNrThreads;
-
-/* FUNCTIONS *****************************************************************/
-
-NTSTATUS STDCALL NtTerminateThread(IN HANDLE ThreadHandle,
-                                  IN NTSTATUS ExitStatus)
-{
-   return(ZwTerminateThread(ThreadHandle,ExitStatus));
-}
-
-NTSTATUS STDCALL ZwTerminateThread(IN HANDLE ThreadHandle, 
-                                  IN NTSTATUS ExitStatus)
-{
-   PETHREAD Thread;
-   NTSTATUS Status;
-   
-   Status = ObReferenceObjectByHandle(ThreadHandle,
-                                     THREAD_TERMINATE,
-                                     PsThreadType,
-                                     UserMode,
-                                     (PVOID*)&Thread,
-                                     NULL);
-   if (Status != STATUS_SUCCESS)
-     {
-       return(Status);
-     }
-   
-   if (Thread == PsGetCurrentThread())
-     {
-       PsTerminateSystemThread(ExitStatus);
-     }
-   else
-     {
-       UNIMPLEMENTED;
-     }
-}
-
-VOID PsReleaseThread(PETHREAD Thread)
-{
-   DPRINT("PsReleaseThread(Thread %x)\n",Thread);
-   
-   RemoveEntryList(&Thread->Tcb.Entry);
-   ObDereferenceObject(Thread);
-}
-
-
-NTSTATUS PsTerminateSystemThread(NTSTATUS ExitStatus)
-/*
- * FUNCTION: Terminates the current thread
- * ARGUMENTS:
- *         ExitStatus = Status to pass to the creater
- * RETURNS: Doesn't
- */
-{
-   KIRQL oldlvl;
-   PETHREAD CurrentThread;
-   
-   PiNrThreads--;
-   
-   CurrentThread = PsGetCurrentThread();
-   
-   CurrentThread->ExitStatus = ExitStatus;
-   
-   DPRINT("terminating %x\n",CurrentThread);
-   ObDereferenceObject(CurrentThread->ThreadsProcess);
-   KeRaiseIrql(DISPATCH_LEVEL,&oldlvl);
-   CurrentThread->Tcb.ThreadState = THREAD_STATE_TERMINATED;
-   ZwYieldExecution();
-   for(;;);
-}
-
-NTSTATUS STDCALL NtRegisterThreadTerminatePort(HANDLE TerminationPort)
-{
-   return(ZwRegisterThreadTerminatePort(TerminationPort));
-}
-
-NTSTATUS STDCALL ZwRegisterThreadTerminatePort(HANDLE TerminationPort)
-{
-   UNIMPLEMENTED;
-}
+/*\r
+ * COPYRIGHT:       See COPYING in the top level directory\r
+ * PROJECT:         ReactOS kernel\r
+ * FILE:            ntoskrnl/ps/kill.c\r
+ * PURPOSE:         Terminating a thread\r
+ * PROGRAMMER:      David Welch (welch@mcmail.com)\r
+ * UPDATE HISTORY:\r
+ *                  Created 22/05/98\r
+ */\r
+\r
+/* INCLUDES *****************************************************************/\r
+\r
+#include <ddk/ntddk.h>\r
+#include <internal/ps.h>\r
+\r
+#define NDEBUG\r
+#include <internal/debug.h>\r
+\r
+/* GLBOALS *******************************************************************/\r
+\r
+extern ULONG PiNrThreads;\r
+\r
+/* FUNCTIONS *****************************************************************/\r
+\r
+NTSTATUS STDCALL NtTerminateProcess(IN HANDLE ProcessHandle,\r
+                                   IN NTSTATUS ExitStatus)\r
+{\r
+   return(ZwTerminateProcess(ProcessHandle,ExitStatus));\r
+}\r
+\r
+NTSTATUS STDCALL ZwTerminateProcess(IN HANDLE ProcessHandle,\r
+                                   IN NTSTATUS ExitStatus)\r
+{\r
+   PETHREAD Thread;\r
+   NTSTATUS Status;\r
+   PEPROCESS Process;\r
+   KIRQL oldlvl;\r
+\r
+   Status = ObReferenceObjectByHandle(ProcessHandle,\r
+                                      PROCESS_TERMINATE,\r
+                                      PsProcessType,\r
+                                     UserMode,\r
+                                      (PVOID*)&Process,\r
+                                     NULL);\r
+   if (Status != STATUS_SUCCESS)\r
+   {\r
+        return(Status);\r
+   }\r
+\r
+   PiTerminateProcessThreads(Process, ExitStatus);\r
+   KeRaiseIrql(DISPATCH_LEVEL, &oldlvl);\r
+   KeDispatcherObjectWakeAll(&Process->Pcb.DispatcherHeader);\r
+   Process->Pcb.ProcessState = PROCESS_STATE_TERMINATED;\r
+   if (PsGetCurrentThread()->ThreadsProcess == Process)\r
+   {\r
+      KeLowerIrql(oldlvl);\r
+      PsTerminateSystemThread(ExitStatus);\r
+   }\r
+   KeLowerIrql(oldlvl);\r
+   return(STATUS_SUCCESS);\r
+}\r
+\r
+\r
+NTSTATUS STDCALL NtTerminateThread(IN HANDLE ThreadHandle,\r
+                                  IN NTSTATUS ExitStatus)\r
+{\r
+   return(ZwTerminateThread(ThreadHandle,ExitStatus));\r
+}\r
+\r
+NTSTATUS STDCALL ZwTerminateThread(IN HANDLE ThreadHandle, \r
+                                  IN NTSTATUS ExitStatus)\r
+{\r
+   PETHREAD Thread;\r
+   NTSTATUS Status;\r
+   \r
+   Status = ObReferenceObjectByHandle(ThreadHandle,\r
+                                     THREAD_TERMINATE,\r
+                                     PsThreadType,\r
+                                     UserMode,\r
+                                     (PVOID*)&Thread,\r
+                                     NULL);\r
+   if (Status != STATUS_SUCCESS)\r
+     {\r
+       return(Status);\r
+     }\r
+\r
+   PsTerminateThread(Thread);\r
+}\r
+\r
+VOID PsTerminateThread(PETHREAD Thread, NTSTATUS ExitStatus)\r
+{\r
+   if (Thread == PsGetCurrentThread())\r
+     {\r
+       PsTerminateSystemThread(ExitStatus);\r
+     }\r
+   else\r
+     {\r
+       UNIMPLEMENTED;\r
+     }\r
+}\r
+\r
+VOID PsReleaseThread(PETHREAD Thread)\r
+{\r
+   DPRINT("PsReleaseThread(Thread %x)\n",Thread);\r
+   \r
+   RemoveEntryList(&Thread->Tcb.Entry);\r
+   ObDereferenceObject(Thread);\r
+}\r
+\r
+\r
+NTSTATUS PsTerminateSystemThread(NTSTATUS ExitStatus)\r
+/*\r
+ * FUNCTION: Terminates the current thread\r
+ * ARGUMENTS:\r
+ *         ExitStatus = Status to pass to the creater\r
+ * RETURNS: Doesn't\r
+ */\r
+{\r
+   KIRQL oldlvl;\r
+   PETHREAD CurrentThread;\r
+   \r
+   PiNrThreads--;\r
+   \r
+   CurrentThread = PsGetCurrentThread();\r
+   \r
+   CurrentThread->ExitStatus = ExitStatus;\r
+   \r
+   DPRINT("terminating %x\n",CurrentThread);\r
+   ObDereferenceObject(CurrentThread->ThreadsProcess);\r
+   KeRaiseIrql(DISPATCH_LEVEL,&oldlvl);\r
+   CurrentThread->Tcb.ThreadState = THREAD_STATE_TERMINATED;\r
+   ZwYieldExecution();\r
+   for(;;);\r
+}\r
+\r
+NTSTATUS STDCALL NtRegisterThreadTerminatePort(HANDLE TerminationPort)\r
+{\r
+   return(ZwRegisterThreadTerminatePort(TerminationPort));\r
+}\r
+\r
+NTSTATUS STDCALL ZwRegisterThreadTerminatePort(HANDLE TerminationPort)\r
+{\r
+   UNIMPLEMENTED;\r
+}\r
index b4ebf11..1a811ab 100644 (file)
@@ -204,21 +204,10 @@ NTSTATUS STDCALL ZwCreateProcess(
        DbgPrint("ZwCreateProcess() non-NULL SectionHandle\n");\r
        return(STATUS_UNSUCCESSFUL);\r
      }\r
-   \r
-   return(STATUS_SUCCESS);\r
-}\r
 \r
+   Process->Pcb.ProcessState = PROCESS_STATE_ACTIVE;\r
 \r
-NTSTATUS STDCALL NtTerminateProcess(IN HANDLE ProcessHandle,\r
-                                   IN NTSTATUS ExitStatus)\r
-{\r
-   return(ZwTerminateProcess(ProcessHandle,ExitStatus));\r
-}\r
-\r
-NTSTATUS STDCALL ZwTerminateProcess(IN HANDLE ProcessHandle,\r
-                                   IN NTSTATUS ExitStatus)\r
-{\r
-   UNIMPLEMENTED;\r
+   return(STATUS_SUCCESS);\r
 }\r
 \r
 \r
@@ -241,8 +230,7 @@ NTSTATUS STDCALL ZwOpenProcess (OUT PHANDLE ProcessHandle,
    UNIMPLEMENTED;\r
 }\r
 \r
-NTSTATUS STDCALL NtQueryInformationProcess(\r
-                                          IN HANDLE ProcessHandle,\r
+NTSTATUS STDCALL NtQueryInformationProcess(IN HANDLE ProcessHandle,\r
                                           IN CINT ProcessInformationClass,\r
                                           OUT PVOID ProcessInformation,\r
                                           IN ULONG ProcessInformationLength,\r
@@ -255,8 +243,7 @@ NTSTATUS STDCALL NtQueryInformationProcess(
                                    ReturnLength));\r
 }\r
 \r
-NTSTATUS STDCALL ZwQueryInformationProcess(\r
-                                          IN HANDLE ProcessHandle,\r
+NTSTATUS STDCALL ZwQueryInformationProcess(IN HANDLE ProcessHandle,\r
                                           IN CINT ProcessInformationClass,\r
                                           OUT PVOID ProcessInformation,\r
                                           IN ULONG ProcessInformationLength,\r
@@ -305,14 +292,10 @@ NTSTATUS STDCALL ZwQueryInformationProcess(
    return(Status);\r
 }\r
 \r
-NTSTATUS\r
-STDCALL\r
-NtSetInformationProcess(\r
-       IN HANDLE ProcessHandle,\r
-       IN CINT ProcessInformationClass,\r
-       IN PVOID ProcessInformation,\r
-       IN ULONG ProcessInformationLength\r
-       )\r
+NTSTATUS STDCALL NtSetInformationProcess(IN HANDLE ProcessHandle,\r
+                                        IN CINT ProcessInformationClass,\r
+                                        IN PVOID ProcessInformation,\r
+                                        IN ULONG ProcessInformationLength)\r
 {\r
    return(ZwSetInformationProcess(ProcessHandle,\r
                                  ProcessInformationClass,\r
@@ -320,14 +303,10 @@ NtSetInformationProcess(
                                  ProcessInformationLength));\r
 }\r
 \r
-NTSTATUS\r
-STDCALL\r
-ZwSetInformationProcess(\r
-       IN HANDLE ProcessHandle,\r
-       IN CINT ProcessInformationClass,\r
-       IN PVOID ProcessInformation,\r
-       IN ULONG ProcessInformationLength\r
-       )\r
+NTSTATUS STDCALL ZwSetInformationProcess(IN HANDLE ProcessHandle,\r
+                                        IN CINT ProcessInformationClass,\r
+                                        IN PVOID ProcessInformation,\r
+                                        IN ULONG ProcessInformationLength)\r
 {\r
    UNIMPLEMENTED;\r
 }\r
index 6602e3b..82747c9 100644 (file)
@@ -46,6 +46,7 @@ static KSPIN_LOCK ThreadListLock = {0,};
 static LIST_ENTRY PriorityListHead[NR_THREAD_PRIORITY_LEVELS]={{NULL,NULL},};\r
 static BOOLEAN DoneInitYet = FALSE;\r
 ULONG PiNrThreads = 0;\r
+ULONG PiNrRunnableThreads = 0;\r
 \r
 static PETHREAD CurrentThread = NULL;\r
 \r
@@ -63,6 +64,33 @@ PETHREAD PsGetCurrentThread(VOID)
    return((PETHREAD)KeGetCurrentThread());\r
 }\r
 \r
+VOID PiTerminateProcessThreads(PEPROCESS Process, NTSTATUS ExitStatus)\r
+{\r
+   KIRQL oldlvl;\r
+   PLIST_ENTRY current_entry;\r
+   PETHREAD current;\r
+   ULONG i;\r
+\r
+   KeAcquireSpinLock(&ThreadListLock, &oldlvl);\r
+\r
+   for (i=0; i<NR_THREAD_PRIORITY_LEVELS; i++)\r
+   {\r
+        current_entry = PriorityListHead[i].Flink;\r
+        while (current_entry != &PriorityListHead[i])\r
+        {\r
+             current = CONTAINING_RECORD(current_entry,ETHREAD,Tcb.Entry);\r
+             if (current->ThreadsProcess == Process &&\r
+                 current != PsGetCurrentThread())\r
+             {\r
+                  PsTerminateThread(current, ExitStatus);\r
+             }\r
+             current_entry = current_entry->Flink;\r
+        }\r
+   }\r
+\r
+   KeReleaseSpinLock(&ThreadListLock, oldlvl);\r
+}\r
+\r
 static VOID PsInsertIntoThreadList(KPRIORITY Priority, PETHREAD Thread)\r
 {\r
    KIRQL oldlvl;\r
@@ -148,7 +176,7 @@ VOID PsDispatchThread(VOID)
        Candidate = PsScanThreadList(CurrentPriority);\r
        if (Candidate == CurrentThread)\r
          {\r
-//             DbgPrint("Scheduling current thread\n");\r
+             DPRINT("Scheduling current thread\n");\r
              KeQueryTickCount(&TickCount);\r
              CurrentThread->Tcb.LastTick = GET_LARGE_INTEGER_LOW_PART(TickCount);\r
             CurrentThread->Tcb.ThreadState = THREAD_STATE_RUNNING;\r
@@ -157,7 +185,7 @@ VOID PsDispatchThread(VOID)
          }\r
        if (Candidate != NULL)\r
          {     \r
-//             DbgPrint("Scheduling %x\n",Candidate);\r
+             DPRINT("Scheduling %x\n",Candidate);\r
             \r
             Candidate->Tcb.ThreadState = THREAD_STATE_RUNNING;\r
             \r
@@ -171,6 +199,8 @@ VOID PsDispatchThread(VOID)
             return;\r
          }\r
      }\r
+   DbgPrint("CRITICAL: No threads are runnable\n");\r
+   KeBugCheck(0);\r
 }\r
 \r
 NTSTATUS PsInitializeThread(HANDLE ProcessHandle, \r
@@ -207,6 +237,7 @@ NTSTATUS PsInitializeThread(HANDLE ProcessHandle,
                                           NULL);\r
        if (Status != STATUS_SUCCESS)\r
          {\r
+            DPRINT("Failed at %s:%d\n",__FILE__,__LINE__);\r
             return(Status);\r
          }\r
      }\r
index 920bf81..4dae5b1 100644 (file)
 #include <ddk/ntddk.h>
 #include <wstring.h>
 
+#define NDEBUG
 #include <internal/debug.h>
 
 wchar_t * ___wcstok = NULL;
 
 /* FUNCTIONS *****************************************************************/
 
+wchar_t* wstrdup(const wchar_t* src)
+{
+   wchar_t* dest;
+   
+   dest = ExAllocatePool(NonPagedPool, (wstrlen(src)+1)*2);
+   wcscpy(dest,src);
+   return(dest);
+}
+
 wchar_t * 
 wcscat(wchar_t *dest, const wchar_t *src)
 {
@@ -86,13 +96,14 @@ int wcscmp(const wchar_t *cs, const wchar_t *ct)
 wchar_t* wcscpy(wchar_t* str1, const wchar_t* str2)
 {
    wchar_t* s = str1;
-   DbgPrint("wcscpy(str1 %w, str2 %w)\n",str1,str2);
+   DPRINT("wcscpy(str1 %w, str2 %w)\n",str1,str2);
    while ((*str2)!=0)
      {
        *s = *str2;
        s++;
        str2++;
      }
+   *s = 0;
    return(str1);
 }