Several bug fixes
authorDavid Welch <welch@cwcom.net>
Sun, 18 Apr 1999 08:56:23 +0000 (08:56 +0000)
committerDavid Welch <welch@cwcom.net>
Sun, 18 Apr 1999 08:56:23 +0000 (08:56 +0000)
Added proper process cleanup
Added several programs for testing

svn path=/trunk/; revision=395

45 files changed:
reactos/apps/tests/bench/bench-thread.c [new file with mode: 0644]
reactos/apps/tests/bench/makefile [new file with mode: 0644]
reactos/apps/tests/test_old/makefile
reactos/apps/tests/test_old/temptest.c [new file with mode: 0644]
reactos/apps/tests/test_old/test-fseek.c [new file with mode: 0644]
reactos/apps/tests/test_old/test-fwrite.c [new file with mode: 0644]
reactos/apps/tests/test_old/test_rdwr.c [new file with mode: 0644]
reactos/apps/tests/test_old/tst-printf.c [new file with mode: 0644]
reactos/apps/tests/test_old/tstdiomisc.c [new file with mode: 0644]
reactos/drivers/fs/vfat/iface.c
reactos/include/ddk/kedef.h
reactos/include/internal/id.h
reactos/lib/crtdll/crtdll.def
reactos/lib/crtdll/io/read.c
reactos/lib/crtdll/io/utime.c [new file with mode: 0644]
reactos/lib/crtdll/makefile
reactos/lib/crtdll/misc/GetArgs.c
reactos/lib/crtdll/stdio/fflush.c
reactos/lib/crtdll/stdio/filbuf.c
reactos/lib/crtdll/stdio/fread.c
reactos/lib/crtdll/stdio/fseek.c
reactos/lib/kernel32/file/create.c
reactos/lib/kernel32/mem/section.c [new file with mode: 0644]
reactos/lib/kernel32/process/create.c
reactos/lib/ntdll/ldr/startup.c
reactos/lib/ntdll/ldr/utils.c
reactos/makefile_rex
reactos/ntoskrnl/hal/x86/exp.c
reactos/ntoskrnl/hal/x86/page.c
reactos/ntoskrnl/io/buildirp.c
reactos/ntoskrnl/io/cleanup.c
reactos/ntoskrnl/io/file.c
reactos/ntoskrnl/io/flush.c
reactos/ntoskrnl/io/fs.c
reactos/ntoskrnl/io/ioctrl.c
reactos/ntoskrnl/io/rw.c
reactos/ntoskrnl/io/symlink.c
reactos/ntoskrnl/ke/wait.c
reactos/ntoskrnl/mm/section.c
reactos/ntoskrnl/mm/virtual.c
reactos/ntoskrnl/ob/handle.c
reactos/ntoskrnl/ob/object.c
reactos/ntoskrnl/ps/kill.c
reactos/ntoskrnl/ps/process.c
reactos/ntoskrnl/ps/thread.c

diff --git a/reactos/apps/tests/bench/bench-thread.c b/reactos/apps/tests/bench/bench-thread.c
new file mode 100644 (file)
index 0000000..87d8d18
--- /dev/null
@@ -0,0 +1,25 @@
+#include <stdio.h>
+#include <windows.h>
+
+#define NR_THREADS (0x1000)
+
+ULONG thread_main(PVOID param)
+{
+}
+
+int main()
+{
+   unsigned int i=0;
+   DWORD id;
+   
+   printf("Creating %d threads\n",NR_THREADS);
+   for (i=0;i<NR_THREADS;i++)
+     {
+       CreateThread(NULL,
+                    0,
+                    thread_main,
+                    NULL,
+                    0,
+                    &id);
+     }
+}
diff --git a/reactos/apps/tests/bench/makefile b/reactos/apps/tests/bench/makefile
new file mode 100644 (file)
index 0000000..779d0fd
--- /dev/null
@@ -0,0 +1,20 @@
+#
+#
+#
+
+all: bench-thread.exe
+
+.phony: all
+
+clean:
+       - $(RM) test-stdio.o
+       - $(RM) test-stdio.exe
+       - $(RM) test-stdio.sym
+
+.phony: clean
+
+bench-thread.exe: bench-thread.c
+       $(CC) bench-thread.c -lkernel32 -o bench-thread.exe
+       $(NM) --numeric-sort bench-thread.exe > bench-thread.sym
+
+include ../../rules.mak
index f97a613..bf9f777 100644 (file)
@@ -1,9 +1,9 @@
 #
 #
 #
-OBJECTS= test-stdio.o
 
-all: test-stdio.exe
+all: test-stdio.exe tst-printf.exe tstdiomisc.exe bug2.exe bug3.exe \
+     temptest.exe test-fseek.exe test_rdwr.exe
 
 .phony: all
 
@@ -14,8 +14,40 @@ clean:
 
 .phony: clean
 
-test-stdio.exe: $(OBJECTS)
-       $(CC) $(OBJECTS) -lkernel32 -o test-stdio.exe
+bug2.exe: bug2.c
+       $(CC) bug2.c -lkernel32 -o bug2.exe
+       $(NM) --numeric-sort bug2.exe > bug2.sym
+
+bug3.exe: bug3.c
+       $(CC) bug3.c -lkernel32 -o bug3.exe
+       $(NM) --numeric-sort bug3.exe > bug3.sym
+
+temptest.exe: temptest.c
+       $(CC) temptest.c -lkernel32 -o temptest.exe
+       $(NM) --numeric-sort temptest.exe > temptest.sym
+
+test-fseek.exe: test-fseek.c
+       $(CC) test-fseek.c -lkernel32 -o test-fseek.exe
+       $(NM) --numeric-sort test-fseek.exe > test-fseek.sym
+
+test-fwrite.exe: test-fwrite.c
+       $(CC) test-fwrite.c -lkernel32 -o test-fwrite.exe
+       $(NM) --numeric-sort test-fwrite.exe > test-fwrite.sym
+
+test_rdwr.exe: test_rdwr.c
+       $(CC) test_rdwr.c -lkernel32 -o test_rdwr.exe
+       $(NM) --numeric-sort test_rdwr.exe > test_rdwr.sym
+
+test-stdio.exe: test-stdio.c
+       $(CC) test-stdio.c -lkernel32 -o test-stdio.exe
        $(NM) --numeric-sort test-stdio.exe > test-stdio.sym
 
+tst-printf.exe: tst-printf.c
+       $(CC) tst-printf.c -lkernel32 -o tst-printf.exe
+       $(NM) --numeric-sort tst-printf.exe > tst-printf.sym
+
+tstdiomisc.exe: tstdiomisc.c
+       $(CC) tstdiomisc.c -lkernel32 -o tstdiomisc.exe
+       $(NM) --numeric-sort tstdiomisc.exe > tstdiomisc.sym
+
 include ../../rules.mak
diff --git a/reactos/apps/tests/test_old/temptest.c b/reactos/apps/tests/test_old/temptest.c
new file mode 100644 (file)
index 0000000..35ea4dc
--- /dev/null
@@ -0,0 +1,27 @@
+#include <stdio.h>
+#include <string.h>
+
+char *files[500];
+
+int
+main (int argc, char *argv[])
+{
+  FILE *fp;
+  int i;
+
+  for (i = 0; i < 500; i++) {
+    files[i] = tempnam (NULL, "file");
+    if (files[i] == NULL) {
+      printf ("tempnam failed\n");
+      exit (1);
+    }
+    printf ("file: %s\n", files[i]);
+    fp = fopen (files[i], "w");
+    fclose (fp);
+  }
+
+  for (i = 0; i < 500; i++)
+    remove (files[i]);
+
+  exit (0);
+}
diff --git a/reactos/apps/tests/test_old/test-fseek.c b/reactos/apps/tests/test_old/test-fseek.c
new file mode 100644 (file)
index 0000000..e736ed7
--- /dev/null
@@ -0,0 +1,85 @@
+/* Copyright (C) 1991, 1992, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <stdio.h>
+
+#define TESTFILE "/tmp/test.dat"
+
+int
+main (void)
+{
+  FILE *fp;
+  int i, j;
+
+  puts ("\nFile seek test");
+  fp = fopen (TESTFILE, "w");
+  if (fp == NULL)
+    {
+      perror (TESTFILE);
+      return 1;
+    }
+
+  for (i = 0; i < 256; i++)
+    putc (i, fp);
+  if (freopen (TESTFILE, "r", fp) != fp)
+    {
+      perror ("Cannot open file for reading");
+      return 1;
+    }
+
+  for (i = 1; i <= 255; i++)
+    {
+      printf ("%3d\n", i);
+      fseek (fp, (long) -i, SEEK_END);
+      if ((j = getc (fp)) != 256 - i)
+       {
+         printf ("SEEK_END failed %d\n", j);
+         break;
+       }
+      if (fseek (fp, (long) i, SEEK_SET))
+       {
+         puts ("Cannot SEEK_SET");
+         break;
+       }
+      if ((j = getc (fp)) != i)
+       {
+         printf ("SEEK_SET failed %d\n", j);
+         break;
+       }
+      if (fseek (fp, (long) i, SEEK_SET))
+       {
+         puts ("Cannot SEEK_SET");
+         break;
+       }
+      if (fseek (fp, (long) (i >= 128 ? -128 : 128), SEEK_CUR))
+       {
+         puts ("Cannot SEEK_CUR");
+         break;
+       }
+      if ((j = getc (fp)) != (i >= 128 ? i - 128 : i + 128))
+       {
+         printf ("SEEK_CUR failed %d\n", j);
+         break;
+       }
+    }
+  fclose (fp);
+  remove (TESTFILE);
+
+  puts ((i > 255) ? "Test succeeded." : "Test FAILED!");
+  return (i > 255) ? 0 : 1;
+}
diff --git a/reactos/apps/tests/test_old/test-fwrite.c b/reactos/apps/tests/test_old/test-fwrite.c
new file mode 100644 (file)
index 0000000..ce54169
--- /dev/null
@@ -0,0 +1,68 @@
+#include <stdio.h>
+#include <string.h>
+
+int
+main (int argc, char *argv[])
+{
+  FILE *f = tmpfile ();
+  char obuf[99999], ibuf[sizeof obuf];
+  char *line;
+  size_t linesz;
+
+  if (! f)
+    {
+      perror ("tmpfile");
+      return 1;
+    }
+
+  if (fputs ("line\n", f) == EOF)
+    {
+      perror ("fputs");
+      return 1;
+    }
+
+  memset (obuf, 'z', sizeof obuf);
+  memset (ibuf, 'y', sizeof ibuf);
+
+  if (fwrite (obuf, sizeof obuf, 1, f) != 1)
+    {
+      perror ("fwrite");
+      return 1;
+    }
+
+  rewind (f);
+
+  line = NULL;
+  linesz = 0;
+  if (getline (&line, &linesz, f) != 5)
+    {
+      perror ("getline");
+      return 1;
+    }
+  if (strcmp (line, "line\n"))
+    {
+      puts ("Lines differ.  Test FAILED!");
+      return 1;
+    }
+
+  if (fread (ibuf, sizeof ibuf, 1, f) != 1)
+    {
+      perror ("fread");
+      return 1;
+    }
+
+  if (memcmp (ibuf, obuf, sizeof ibuf))
+    {
+      puts ("Buffers differ.  Test FAILED!");
+      return 1;
+    }
+
+  asprintf (&line, "\
+GDB is free software and you are welcome to distribute copies of it\n\
+ under certain conditions; type \"show copying\" to see the conditions.\n\
+There is absolutely no warranty for GDB; type \"show warranty\" for details.\n\
+");
+
+  puts ("Test succeeded.");
+  return 0;
+}
diff --git a/reactos/apps/tests/test_old/test_rdwr.c b/reactos/apps/tests/test_old/test_rdwr.c
new file mode 100644 (file)
index 0000000..a3b01b7
--- /dev/null
@@ -0,0 +1,129 @@
+/* Copyright (C) 1991, 1992, 1996, 1997, 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+int
+main (int argc, char **argv)
+{
+  static const char hello[] = "Hello, world.\n";
+  static const char replace[] = "Hewwo, world.\n";
+  static const size_t replace_from = 2, replace_to = 4;
+  char filename[FILENAME_MAX];
+  char *name = strrchr (*argv, '/');
+  char buf[BUFSIZ];
+  FILE *f;
+  int lose = 0;
+
+  if (name != NULL)
+    ++name;
+  else
+    name = *argv;
+
+  (void) sprintf (filename, "/tmp/%s.test", name);
+
+  f = fopen (filename, "w+");
+  if (f == NULL)
+    {
+      perror (filename);
+      exit (1);
+    }
+
+  (void) fputs (hello, f);
+  rewind (f);
+  (void) fgets (buf, sizeof (buf), f);
+  rewind (f);
+  (void) fputs (buf, f);
+  rewind (f);
+  {
+    size_t i;
+    for (i = 0; i < replace_from; ++i)
+      {
+       int c = getc (f);
+       if (c == EOF)
+         {
+           printf ("EOF at %Zu.\n", i);
+           lose = 1;
+           break;
+         }
+       else if (c != hello[i])
+         {
+           printf ("Got '%c' instead of '%c' at %Zu.\n",
+                   (unsigned char) c, hello[i], i);
+           lose = 1;
+           break;
+         }
+      }
+  }
+
+  {
+    long int where = ftell (f);
+    if (where == (long int) replace_from)
+      {
+       register size_t i;
+       for (i = replace_from; i < replace_to; ++i)
+         if (putc(replace[i], f) == EOF)
+           {
+             printf ("putc('%c') got %s at %Zu.\n",
+                     replace[i], strerror (errno), i);
+             lose = 1;
+             break;
+           }
+      }
+    else if (where == -1L)
+      {
+       printf ("ftell got %s (should be at %Zu).\n",
+               strerror (errno), replace_from);
+       lose = 1;
+      }
+    else
+      {
+       printf ("ftell returns %lu; should be %Zu.\n", where, replace_from);
+       lose = 1;
+      }
+  }
+
+  if (!lose)
+    {
+      rewind (f);
+      if (fgets (buf, sizeof (buf), f) == NULL)
+       {
+         printf ("fgets got %s.\n", strerror(errno));
+         lose = 1;
+       }
+      else if (strcmp (buf, replace))
+       {
+         printf ("Read \"%s\" instead of \"%s\".\n", buf, replace);
+         lose = 1;
+       }
+    }
+
+  if (lose)
+    printf ("Test FAILED!  Losing file is \"%s\".\n", filename);
+  else
+    {
+      (void) remove (filename);
+      puts ("Test succeeded.");
+    }
+
+  exit (lose ? EXIT_FAILURE : EXIT_SUCCESS);
+}
diff --git a/reactos/apps/tests/test_old/tst-printf.c b/reactos/apps/tests/test_old/tst-printf.c
new file mode 100644 (file)
index 0000000..8c4feed
--- /dev/null
@@ -0,0 +1,311 @@
+/* Copyright (C) 1991, 92, 93, 95, 96, 97, 98 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifdef BSD
+#include </usr/include/stdio.h>
+#define EXIT_SUCCESS 0
+#else
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#endif
+
+#include <float.h>
+
+void rfg1 (void);
+void rfg2 (void);
+
+
+void
+fmtchk (const char *fmt)
+{
+  (void) fputs(fmt, stdout);
+  (void) printf(":\t`");
+  (void) printf(fmt, 0x12);
+  (void) printf("'\n");
+}
+
+void
+fmtst1chk (const char *fmt)
+{
+  (void) fputs(fmt, stdout);
+  (void) printf(":\t`");
+  (void) printf(fmt, 4, 0x12);
+  (void) printf("'\n");
+}
+
+void
+fmtst2chk (const char *fmt)
+{
+  (void) fputs(fmt, stdout);
+  (void) printf(":\t`");
+  (void) printf(fmt, 4, 4, 0x12);
+  (void) printf("'\n");
+}
+\f
+/* This page is covered by the following copyright: */
+
+/* (C) Copyright C E Chew
+ *
+ * Feel free to copy, use and distribute this software provided:
+ *
+ *     1. you do not pretend that you wrote it
+ *     2. you leave this copyright notice intact.
+ */
+
+/*
+ * Extracted from exercise.c for glibc-1.05 bug report by Bruce Evans.
+ */
+
+#define DEC -123
+#define INT 255
+#define UNS (~0)
+
+/* Formatted Output Test
+ *
+ * This exercises the output formatting code.
+ */
+
+void
+fp_test (void)
+{
+  int i, j, k, l;
+  char buf[7];
+  char *prefix = buf;
+  char tp[20];
+
+  puts("\nFormatted output test");
+  printf("prefix  6d      6o      6x      6X      6u\n");
+  strcpy(prefix, "%");
+  for (i = 0; i < 2; i++) {
+    for (j = 0; j < 2; j++) {
+      for (k = 0; k < 2; k++) {
+       for (l = 0; l < 2; l++) {
+         strcpy(prefix, "%");
+         if (i == 0) strcat(prefix, "-");
+         if (j == 0) strcat(prefix, "+");
+         if (k == 0) strcat(prefix, "#");
+         if (l == 0) strcat(prefix, "0");
+         printf("%5s |", prefix);
+         strcpy(tp, prefix);
+         strcat(tp, "6d |");
+         printf(tp, DEC);
+         strcpy(tp, prefix);
+         strcat(tp, "6o |");
+         printf(tp, INT);
+         strcpy(tp, prefix);
+         strcat(tp, "6x |");
+         printf(tp, INT);
+         strcpy(tp, prefix);
+         strcat(tp, "6X |");
+         printf(tp, INT);
+         strcpy(tp, prefix);
+         strcat(tp, "6u |");
+         printf(tp, UNS);
+         printf("\n");
+       }
+      }
+    }
+  }
+  printf("%10s\n", (char *) NULL);
+  printf("%-10s\n", (char *) NULL);
+}
+\f
+int
+main (int argc, char *argv[])
+{
+  static char shortstr[] = "Hi, Z.";
+  static char longstr[] = "Good morning, Doctor Chandra.  This is Hal.  \
+I am ready for my first lesson today.";
+
+  fmtchk("%.4x");
+  fmtchk("%04x");
+  fmtchk("%4.4x");
+  fmtchk("%04.4x");
+  fmtchk("%4.3x");
+  fmtchk("%04.3x");
+
+  fmtst1chk("%.*x");
+  fmtst1chk("%0*x");
+  fmtst2chk("%*.*x");
+  fmtst2chk("%0*.*x");
+
+#ifndef        BSD
+  printf("bad format:\t\"%b\"\n");
+  printf("nil pointer (padded):\t\"%10p\"\n", (void *) NULL);
+#endif
+
+  printf("decimal negative:\t\"%d\"\n", -2345);
+  printf("octal negative:\t\"%o\"\n", -2345);
+  printf("hex negative:\t\"%x\"\n", -2345);
+  printf("long decimal number:\t\"%ld\"\n", -123456L);
+  printf("long octal negative:\t\"%lo\"\n", -2345L);
+  printf("long unsigned decimal number:\t\"%lu\"\n", -123456L);
+  printf("zero-padded LDN:\t\"%010ld\"\n", -123456L);
+  printf("left-adjusted ZLDN:\t\"%-010ld\"\n", -123456);
+  printf("space-padded LDN:\t\"%10ld\"\n", -123456L);
+  printf("left-adjusted SLDN:\t\"%-10ld\"\n", -123456L);
+
+  printf("zero-padded string:\t\"%010s\"\n", shortstr);
+  printf("left-adjusted Z string:\t\"%-010s\"\n", shortstr);
+  printf("space-padded string:\t\"%10s\"\n", shortstr);
+  printf("left-adjusted S string:\t\"%-10s\"\n", shortstr);
+  printf("null string:\t\"%s\"\n", (char *)NULL);
+  printf("limited string:\t\"%.22s\"\n", longstr);
+
+  printf("e-style >= 1:\t\"%e\"\n", 12.34);
+  printf("e-style >= .1:\t\"%e\"\n", 0.1234);
+  printf("e-style < .1:\t\"%e\"\n", 0.001234);
+  printf("e-style big:\t\"%.60e\"\n", 1e20);
+  printf ("e-style == .1:\t\"%e\"\n", 0.1);
+  printf("f-style >= 1:\t\"%f\"\n", 12.34);
+  printf("f-style >= .1:\t\"%f\"\n", 0.1234);
+  printf("f-style < .1:\t\"%f\"\n", 0.001234);
+  printf("g-style >= 1:\t\"%g\"\n", 12.34);
+  printf("g-style >= .1:\t\"%g\"\n", 0.1234);
+  printf("g-style < .1:\t\"%g\"\n", 0.001234);
+  printf("g-style big:\t\"%.60g\"\n", 1e20);
+
+  printf (" %6.5f\n", .099999999860301614);
+  printf (" %6.5f\n", .1);
+  printf ("x%5.4fx\n", .5);
+
+  printf ("%#03x\n", 1);
+
+  {
+    double d = FLT_MIN;
+    int niter = 17;
+
+    while (niter-- != 0)
+      printf ("%.17e\n", d / 2);
+    fflush (stdout);
+  }
+
+  printf ("%15.5e\n", 4.9406564584124654e-324);
+
+#define FORMAT "|%12.4f|%12.4e|%12.4g|\n"
+  printf (FORMAT, 0.0, 0.0, 0.0);
+  printf (FORMAT, 1.0, 1.0, 1.0);
+  printf (FORMAT, -1.0, -1.0, -1.0);
+  printf (FORMAT, 100.0, 100.0, 100.0);
+  printf (FORMAT, 1000.0, 1000.0, 1000.0);
+  printf (FORMAT, 10000.0, 10000.0, 10000.0);
+  printf (FORMAT, 12345.0, 12345.0, 12345.0);
+  printf (FORMAT, 100000.0, 100000.0, 100000.0);
+  printf (FORMAT, 123456.0, 123456.0, 123456.0);
+#undef FORMAT
+
+  {
+    char buf[20];
+    printf ("sprintf (\"%%30s\", \"foo\") == %d, \"%.*s\"\n",
+           sprintf (buf, "%30s", "foo"), sizeof (buf), buf);
+  }
+
+  fp_test ();
+
+  printf ("%e should be 1.234568e+06\n", 1234567.8);
+  printf ("%f should be 1234567.800000\n", 1234567.8);
+  printf ("%g should be 1.23457e+06\n", 1234567.8);
+  printf ("%g should be 123.456\n", 123.456);
+  printf ("%g should be 1e+06\n", 1000000.0);
+  printf ("%g should be 10\n", 10.0);
+  printf ("%g should be 0.02\n", 0.02);
+
+  {
+    double x=1.0;
+    printf("%.17f\n",(1.0/x/10.0+1.0)*x-x);
+  }
+
+  puts ("--- Should be no further output. ---");
+  rfg1 ();
+  rfg2 ();
+
+  {
+    char buf[200];
+    int result;
+
+    sprintf(buf,"%*s%*s%*s",-1,"one",-20,"two",-30,"three");
+
+    result = strcmp (buf,
+                    "onetwo                 three                         ");
+
+    puts (result != 0 ? "Test failed!" : "Test ok.");
+    return result != 0;
+  }
+}
+\f
+void
+rfg1 (void)
+{
+  char buf[100];
+
+  sprintf (buf, "%5.s", "xyz");
+  if (strcmp (buf, "     ") != 0)
+    printf ("got: '%s', expected: '%s'\n", buf, "     ");
+  sprintf (buf, "%5.f", 33.3);
+  if (strcmp (buf, "   33") != 0)
+    printf ("got: '%s', expected: '%s'\n", buf, "   33");
+  sprintf (buf, "%8.e", 33.3e7);
+  if (strcmp (buf, "   3e+08") != 0)
+    printf ("got: '%s', expected: '%s'\n", buf, "   3e+08");
+  sprintf (buf, "%8.E", 33.3e7);
+  if (strcmp (buf, "   3E+08") != 0)
+    printf ("got: '%s', expected: '%s'\n", buf, "   3E+08");
+  sprintf (buf, "%.g", 33.3);
+  if (strcmp (buf, "3e+01") != 0)
+    printf ("got: '%s', expected: '%s'\n", buf, "3e+01");
+  sprintf (buf, "%.G", 33.3);
+  if (strcmp (buf, "3E+01") != 0)
+    printf ("got: '%s', expected: '%s'\n", buf, "3E+01");
+}
+
+void
+rfg2 (void)
+{
+  int prec;
+  char buf[100];
+
+  prec = 0;
+  sprintf (buf, "%.*g", prec, 3.3);
+  if (strcmp (buf, "3") != 0)
+    printf ("got: '%s', expected: '%s'\n", buf, "3");
+  prec = 0;
+  sprintf (buf, "%.*G", prec, 3.3);
+  if (strcmp (buf, "3") != 0)
+    printf ("got: '%s', expected: '%s'\n", buf, "3");
+  prec = 0;
+  sprintf (buf, "%7.*G", prec, 3.33);
+  if (strcmp (buf, "      3") != 0)
+    printf ("got: '%s', expected: '%s'\n", buf, "      3");
+  prec = 3;
+  sprintf (buf, "%04.*o", prec, 33);
+  if (strcmp (buf, " 041") != 0)
+    printf ("got: '%s', expected: '%s'\n", buf, " 041");
+  prec = 7;
+  sprintf (buf, "%09.*u", prec, 33);
+  if (strcmp (buf, "  0000033") != 0)
+    printf ("got: '%s', expected: '%s'\n", buf, "  0000033");
+  prec = 3;
+  sprintf (buf, "%04.*x", prec, 33);
+  if (strcmp (buf, " 021") != 0)
+    printf ("got: '%s', expected: '%s'\n", buf, " 021");
+  prec = 3;
+  sprintf (buf, "%04.*X", prec, 33);
+  if (strcmp (buf, " 021") != 0)
+    printf ("got: '%s', expected: '%s'\n", buf, " 021");
+}
diff --git a/reactos/apps/tests/test_old/tstdiomisc.c b/reactos/apps/tests/test_old/tstdiomisc.c
new file mode 100644 (file)
index 0000000..1affac5
--- /dev/null
@@ -0,0 +1,56 @@
+#include <stdio.h>
+
+int
+t1 (void)
+{
+  int n = -1;
+  sscanf ("abc  ", "abc %n", &n);
+  printf ("t1: count=%d\n", n);
+
+  return n != 5;
+}
+
+int
+t2 (void)
+{
+  int result = 0;
+  int n;
+  long N;
+  int retval;
+#define SCAN(INPUT, FORMAT, VAR, EXP_RES, EXP_VAL) \
+  VAR = -1; \
+  retval = sscanf (INPUT, FORMAT, &VAR); \
+  printf ("sscanf (\"%s\", \"%s\", &x) => %d, x = %ld\n", \
+         INPUT, FORMAT, retval, (long int) VAR); \
+  result |= retval != EXP_RES || VAR != EXP_VAL
+
+  SCAN ("12345", "%ld", N, 1, 12345);
+  SCAN ("12345", "%llllld", N, 0, -1);
+  SCAN ("12345", "%LLLLLd", N, 0, -1);
+  SCAN ("test ", "%*s%n",  n, 0, 4);
+  SCAN ("test ", "%2*s%n",  n, 0, -1);
+  SCAN ("12 ",   "%l2d",  n, 0, -1);
+  SCAN ("12 ",   "%2ld",  N, 1, 12);
+
+  n = -1;
+  N = -1;
+  retval = sscanf ("1 1", "%d %Z", &n, &N);
+  printf ("sscanf (\"1 1\", \"%%d %%Z\", &n, &N) => %d, n = %d, N = %ld\n", \
+         retval, n, N); \
+  result |= retval != 1 || n != 1 || N != -1;
+
+  return result;
+}
+
+int
+main (int argc, char *argv[])
+{
+  int result = 0;
+
+  result |= t1 ();
+  result |= t2 ();
+
+  result |= fflush (stdout) == EOF;
+
+  return result;
+}
index 20a8ca0..96d4b68 100644 (file)
@@ -1585,10 +1585,10 @@ NTSTATUS FsdSetPositionInformation(PFILE_OBJECT FileObject,
                                   PDEVICE_OBJECT DeviceObject,
                                    PFILE_POSITION_INFORMATION PositionInfo)
  {
-    DbgPrint("FsdSetPositionInformation()\n");
+    DPRINT("FsdSetPositionInformation()\n");
     
-    DbgPrint("PositionInfo %x\n", PositionInfo);
-    DbgPrint("Setting position %d\n",GET_LARGE_INTEGER_LOW_PART(
+    DPRINT("PositionInfo %x\n", PositionInfo);
+    DPRINT("Setting position %d\n",GET_LARGE_INTEGER_LOW_PART(
                                   PositionInfo->CurrentByteOffset));
     memcpy(&FileObject->CurrentByteOffset,&PositionInfo->CurrentByteOffset,
           sizeof(LARGE_INTEGER));
@@ -1601,11 +1601,11 @@ NTSTATUS FsdGetPositionInformation(PFILE_OBJECT FileObject,
                                   PDEVICE_OBJECT DeviceObject,
                                    PFILE_POSITION_INFORMATION PositionInfo)
  {
-    DbgPrint("FsdGetPositionInformation()\n");
+    DPRINT("FsdGetPositionInformation()\n");
     
     memcpy(&PositionInfo->CurrentByteOffset, &FileObject->CurrentByteOffset,
           sizeof(LARGE_INTEGER));
-    DbgPrint("Getting position %x\n",GET_LARGE_INTEGER_LOW_PART(
+    DPRINT("Getting position %x\n",GET_LARGE_INTEGER_LOW_PART(
                                   PositionInfo->CurrentByteOffset));
     return(STATUS_SUCCESS);
  }
@@ -1679,7 +1679,7 @@ NTSTATUS FsdSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp)
    assert(DeviceObject != NULL);
    assert(Irp != NULL);
    
-   DbgPrint("FsdSetInformation(DeviceObject %x, Irp %x)\n",
+   DPRINT("FsdSetInformation(DeviceObject %x, Irp %x)\n",
            DeviceObject,Irp);
    
    /* INITIALIZATION */
@@ -1695,8 +1695,8 @@ NTSTATUS FsdSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp)
      SystemBuffer = Irp->UserBuffer;
    //   SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
    
-   DbgPrint("FileInformationClass %d\n",FileInformationClass);
-   DbgPrint("SystemBuffer %x\n",SystemBuffer);
+   DPRINT("FileInformationClass %d\n",FileInformationClass);
+   DPRINT("SystemBuffer %x\n",SystemBuffer);
 
    switch(FileInformationClass) 
      {
index 19d00f8..9afe3e5 100644 (file)
@@ -9,7 +9,6 @@ typedef enum _EVENT_TYPE
    NotificationEvent,
    SynchronizationEvent,
    SemaphoreType,
-   ProcessType,
 } EVENT_TYPE;
 
 typedef enum _KWAIT_REASON
index 1d09562..2addb17 100644 (file)
@@ -3,10 +3,11 @@
  */
 
 
-#define ID_BASE_OBJECT      (0x1234)
+#define ID_BASE_OBJECT      (0x34)
 #define ID_FILE_OBJECT      (ID_BASE_OBJECT + 1)
 #define ID_DEVICE_OBJECT    (ID_BASE_OBJECT + 2)
 #define ID_DRIVER_OBJECT    (ID_BASE_OBJECT + 3)
 #define ID_DIRECTORY_OBJECT (ID_BASE_OBJECT + 4)
 #define ID_EVENT_OBJECT     (ID_BASE_OBJECT + 5)
 #define ID_TIMER_OBJECT     (ID_BASE_OBJECT + 6)
+#define ID_PROCESS_OBJECT   (ID_BASE_OBJECT + 7)
index 5cab39c..3457817 100644 (file)
@@ -17,9 +17,9 @@
 ;  DISCLAMED. This includes but is not limited to warrenties of
 ;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 ;
-; $Revision: 1.7 $
-; $Author: ariadne $
-; $Date: 1999/04/14 21:26:48 $
+; $Revision: 1.8 $
+; $Author: dwelch $
+; $Date: 1999/04/18 08:56:06 $
 ;
 ; These three functions appear to be name mangled in some way, so GCC is
 ; probably not going to be able to use them in any case.
@@ -72,7 +72,7 @@ __GetMainArgs
 ;__threadid
 ;__toascii
 ;_abnormal_termination
-;_access
+_access
 ;_acmdln_dll
 ;_aexit_rtn_dll
 ;_amsg_exit
@@ -86,13 +86,13 @@ __GetMainArgs
 ;_cabs
 _cexit
 ;_cgets
-;_chdir
+_chdir
 ;_chdrive
 ;_chgsign
 _chmod
 ;_chsize
 ;_clearfp
-;_close
+_close
 ;_commit
 ;_commode_dll
 ;_control87
@@ -106,8 +106,8 @@ _chmod
 ;_ctype
 ;_cwait
 ;_daylight_dll
-;_dup
-;_dup2
+_dup
+_dup2
 ;_ecvt
 ;_endthread
 ;_environ_dll
@@ -129,15 +129,15 @@ _fcloseall
 _fdopen
 ;_fgetchar
 ;_fgetwchar
-;_filbuf
+_filbuf
 ;_fileinfo_dll
-;_filelength
+_filelength
 _fileno
-;_findclose
-;_findfirst
-;_findnext
+_findclose
+_findfirst
+_findnext
 ;_finite
-;_flsbuf
+_flsbuf
 ;_flushall
 _fmode_dll
 ;_fpclass
@@ -152,12 +152,12 @@ _fstat
 ;_fullpath
 ;_futime
 ;_gcvt
-;_get_osfhandle
-;_getch
-;_getche
-;_getcwd
+_get_osfhandle
+_getch
+_getche
+_getcwd
 ;_getdcwd
-;_getdiskfree
+_getdiskfree
 ;_getdllprocaddr
 ;_getdrive
 ;_getdrives
@@ -172,8 +172,8 @@ _fstat
 ;_hypot
 ;_initterm
 _iob
-;_isatty
-;_isctype
+_isatty
+_isctype
 ;_ismbbalnum
 ;_ismbbalpha
 ;_ismbbgraph
@@ -213,7 +213,7 @@ _iob
 ;_lrotl
 ;_lrotr
 ;_lsearch
-;_lseek
+_lseek
 ;_ltoa
 ;_makepath
 ;_matherr
@@ -272,8 +272,8 @@ _mktemp
 ;_msize
 ;_nextafter
 ;_onexit
-;_open
-;_open_osfhandle
+_open
+_open_osfhandle
 ;_osmajor_dll
 ;_osminor_dll
 ;_osmode_dll
@@ -286,10 +286,10 @@ _pipe
 ;_popen
 ;_purecall
 ;_putch
-;_putenv
+_putenv
 ;_putw
 ;_pwctype_dll
-;_read
+_read
 ;_rmdir
 ;_rmtmp
 ;_rotl
@@ -300,7 +300,7 @@ _pipe
 ;_setjmp
 _setmode
 ;_setsystime
-;_sleep
+_sleep
 ;_snprintf
 ;_snwprintf
 ;_sopen
@@ -349,7 +349,7 @@ _umask
 ;_ungetch
 _unlink
 ;_unloaddll
-;_utime
+_utime
 ;_vsnprintf
 ;_vsnwprintf
 ;_wcsdup
@@ -371,29 +371,29 @@ _write
 ;_y1
 ;_yn
 abort
-;abs
-;acos
-;asctime
-;asin
-;atan
-;atan2
+abs
+acos
+asctime
+asin
+atan
+atan2
 atexit
-;atof
+atof
 atoi
 atol
-;bsearch
-;calloc
-;ceil
+bsearch
+calloc
+ceil
 ;clearerr
-;clock
-;cos
-;cosh
+clock
+cos
+cosh
 ctime
-;difftime
-;div
+difftime
+div
 exit
-;exp
-;fabs
+exp
+fabs
 fclose
 feof
 ferror
@@ -402,8 +402,8 @@ fgetc
 fgetpos
 fgets
 ;fgetwc
-;floor
-;fmod
+floor
+fmod
 fopen
 fprintf
 fputc
@@ -424,7 +424,7 @@ getc
 getchar
 getenv
 gets
-;gmtime
+gmtime
 is_wctype
 isalnum
 isalpha
@@ -451,13 +451,13 @@ iswspace
 iswupper
 iswxdigit
 isxdigit
-;labs
-;ldexp
-;ldiv
+labs
+ldexp
+ldiv
 ;localeconv
 ;localtime
-;log
-;log10
+log
+log10
 ;longjmp
 malloc
 ;mblen
@@ -468,70 +468,70 @@ memcmp
 memcpy
 memmove
 memset
-;mktime
-;modf
+mktime
+modf
 perror
-;pow
+pow
 printf
 putc
 putchar
 puts
-;qsort
-;raise
+qsort
+raise
 ;rand
 realloc
 remove
 rename
 rewind
 scanf
-;setbuf
+setbuf
 ;setlocale
-;setvbuf
-;signal
-;sin
-;sinh
+setvbuf
+signal
+sin
+sinh
 sprintf
-;sqrt
+sqrt
 ;srand
 sscanf
 strcat
 strchr
 strcmp
-;strcoll
+strcoll
 strcpy
-;strcspn
+strcspn
 strerror
-;strftime
+strftime
 strlen
-;strncat
+strncat
 strncmp
 strncpy
-;strpbrk
+strpbrk
 strrchr
-;strspn
-;strstr
-;strtod
-;strtok
+strspn
+strstr
+strtod
+strtok
 strtol
 strtoul
-;strxfrm
+strxfrm
 ;swprintf
 ;swscanf
 ;system
-;tan
-;tanh
+tan
+tanh
 time
-;tmpfile
-;tmpnam
+tmpfile
+tmpnam
 tolower
-;toupper
+toupper
 ;towlower
 ;towupper
-;ungetc
+ungetc
 ;ungetwc
 vfprintf
 ;vfwprintf
-;vprintf
+vprintf
 vsprintf
 ;vswprintf
 ;vwprintf
index 0db3018..520e2ec 100644 (file)
@@ -14,13 +14,9 @@ size_t       _read(int _fd, void *_buf, size_t _nbyte)
 {
    size_t _rbyte;
    
-   printf("_read(fd %d, buf %x, _nbyte %d)\n",_fd,_buf,_nbyte);
-   
    if (!ReadFile(_get_osfhandle(_fd),_buf,_nbyte,&_rbyte,NULL)) 
      {
-       printf("_read() = %d\n",-1);
        return -1;
      }
-   printf("_read() = %d\n",_rbyte);
    return _rbyte;
 }
diff --git a/reactos/lib/crtdll/io/utime.c b/reactos/lib/crtdll/io/utime.c
new file mode 100644 (file)
index 0000000..c77beb4
--- /dev/null
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+int _utime(const char* filename, struct utimbuf* buf)
+{
+   printf("utime(filename %s, buf %x)\n",filename,buf);
+   return(-1);
+}
index 1920965..6128274 100644 (file)
@@ -66,7 +66,7 @@ QUAD_OBJECTS =  quad/qdivrem.o quad/divdi3.o quad/moddi3.o quad/udivdi3.o quad/u
 IO_OBJECTS = io/access.o io/close.o io/create.o io/dup.o io/dup2.o io/find.o io/isatty.o io/lseek.o \
                io/open.o io/read.o io/setmode.o io/unlink.o io/write.o io/fmode.o io/mktemp.o\
                io/chmod.o io/chsize.o io/commit.o io/locking.o io/pipe.o io/sopen.o io/filelen.o\
-               io/umask.o io/tell.o io/eof.o
+               io/umask.o io/tell.o io/eof.o io/utime.o
 
 SEARCH_OBJECTS = search/lsearch.o search/lfind.o
 
@@ -124,7 +124,8 @@ OBJECTS = $(MISC_OBJECTS) $(STDLIB_OBJECTS) $(IO_OBJECTS) \
          $(STDIO_OBJECTS) $(CTYPE_OBJECTS) $(MATH_OBJECTS) \
          $(STRING_OBJECTS) $(TIME_OBJECTS) $(WCHAR_OBJECTS) \
          $(SYS_STAT_OBJECTS) misc/dllmain.o $(MALLOC_OBJECTS) \
-         $(SEARCH_OBJECTS) $(CONIO_OBJECTS) $(DIRECT_OBJECTS)
+         $(SEARCH_OBJECTS) $(CONIO_OBJECTS) $(DIRECT_OBJECTS) \
+         $(SIGNAL_OBJECTS)
 
 
  crtdll.a: $(OBJECTS)
index 84e7998..46ae863 100644 (file)
@@ -53,30 +53,32 @@ int __GetMainArgs(int *argc,char ***argv,char ***env,int flag)
    i=0;
    afterlastspace=0;
    
-   
-   while (_acmdln_dll[i]) {
-       if (_acmdln_dll[i]==' ') {
+   while (_acmdln_dll[i]) 
+     {
+       if (_acmdln_dll[i]==' ') 
+         {
             __argc++;
             _acmdln_dll[i]='\0';
-            __argv[__argc-1] = strdup(_acmdln_dll+afterlastspace);
+            __argv[__argc-1] = strdup(_acmdln_dll + afterlastspace);
             i++;
             while (_acmdln_dll[i]==' ')
               i++;
-            if (_acmdln_dll[i])
-              afterlastspace=i;
+            afterlastspace=i;
          } 
        else
          {
             i++;
          }
      }
-  
    
-   __argc++;
-   _acmdln_dll[i]='\0';
-   __argv[__argc-1] = strdup(_acmdln_dll+afterlastspace);
+   if (_acmdln_dll[afterlastspace] != 0)
+     {
+       __argc++;
+       _acmdln_dll[i]='\0';
+       __argv[__argc-1] = strdup(_acmdln_dll+afterlastspace);
+     }
    HeapValidate(GetProcessHeap(),0,NULL);
-
+   
    _environ = (char **)GetEnvironmentStringsA();;
    _environ_dll = &_environ;    
     
index 066bff9..c57c08a 100644 (file)
 
 int fflush(FILE *f)
 {
-  char *base;
-  int n, rn;
-
-  if (f == NULL)
-  {
-     int e = errno;
-
-     __set_errno(0);
-    _fwalk((void (*)(FILE *))fflush);
-    if (_errno)
-      return EOF;
-    __set_errno(e);
-    return 0;
-  }
-
-  f->_flag &= ~_IOUNGETC;
-  if ((f->_flag&(_IONBF|_IOWRT))==_IOWRT
-      && (base = f->_base) != NULL
-      && (rn = n = f->_ptr - base) > 0)
-  {
-    f->_ptr = base;
-    f->_cnt = (f->_flag&(_IOLBF|_IONBF)) ? 0 : f->_bufsiz;
-    do {
-      n = _write(fileno(f), base, rn);
-      if (n <= 0) {
-       f->_flag |= _IOERR;
-       return EOF;
-      }
-      rn -= n;
-      base += n;
-    } while (rn > 0);
-  }
-  if (f->_flag & _IORW)
-  {
-    f->_cnt = 0;
-    f->_flag &= ~(_IOWRT|_IOREAD);
-    f->_ptr = f->_base;
-  }
-  return 0;
+   char *base;
+   int n, rn;
+   
+   if (f == NULL)
+     {
+       int e = errno;
+       
+       __set_errno(0);
+       _fwalk((void (*)(FILE *))fflush);
+       if (_errno)
+         return EOF;
+       __set_errno(e);
+       return 0;
+     }
+   
+   f->_flag &= ~_IOUNGETC;
+   if ((f->_flag&(_IONBF|_IOWRT))==_IOWRT
+       && (base = f->_base) != NULL
+       && (rn = n = f->_ptr - base) > 0)
+     {
+       f->_ptr = base;
+       f->_cnt = (f->_flag&(_IOLBF|_IONBF)) ? 0 : f->_bufsiz;
+       do 
+         {
+            n = _write(fileno(f), base, rn);
+            if (n <= 0) 
+              {
+                 f->_flag |= _IOERR;
+                 return EOF;
+              }
+            rn -= n;
+            base += n;
+         } while (rn > 0);
+     }
+   if (f->_flag & _IORW)
+     {
+       f->_cnt = 0;
+       f->_flag &= ~(_IOWRT|_IOREAD);
+       f->_ptr = f->_base;
+     }
+   return 0;
 }
index 19e5c5e..ffbe39a 100644 (file)
 #include <crtdll/io.h>
 #include <crtdll/wchar.h>
 
-/* Note: We set _fillsize to 512, and use that for reading instead of
-   _bufsize, for performance reasons.  We double _fillsize each time
-   we read here, and reset it to 512 each time we call fseek.  That
-   way, we don't waste time reading data we won't use, or doing lots
-   of small reads we could optimize.  If we do lots of seeking, we'll
-   end up maintaining small read sizes, but if we don't seek, we'll
-   eventually read blocks as large as the transfer buffer. */
+/* 
+ * Note: We set _fillsize to 512, and use that for reading instead of
+ * _bufsize, for performance reasons.  We double _fillsize each time
+ * we read here, and reset it to 512 each time we call fseek.  That
+ * way, we don't waste time reading data we won't use, or doing lots
+ * of small reads we could optimize.  If we do lots of seeking, we'll
+ * end up maintaining small read sizes, but if we don't seek, we'll
+ * eventually read blocks as large as the transfer buffer. 
+ */
 
-int
-_filbuf(FILE *f)
+int _filbuf(FILE *f)
 {
   int size, fillsize;
   char c;
 
   if (f->_flag & _IORW)
-    f->_flag |= _IOREAD;
+     f->_flag |= _IOREAD;
+   
+   if ((f->_flag&_IOREAD) == 0)
+     return EOF;
+   if (f->_flag&(_IOSTRG|_IOEOF))
+     return EOF;
+   f->_flag &= ~_IOUNGETC;
+   
+   if (f->_base==NULL && (f->_flag&_IONBF)==0) 
+     {
+       size = 512;
+       if ((f->_base = malloc(size)) == NULL)
+         {
+            f->_flag |= _IONBF;
+            f->_flag &= ~(_IOFBF|_IOLBF);
+         }
+       else
+         {
+            f->_flag |= _IOMYBUF;
+            f->_bufsiz = size;
+            //f->_fillsize = 512;
+         }
+     }
+   
+   if (f->_flag&_IONBF)
+     f->_base = &c;
+   
+   if (f == stdin) 
+     {
+       if (stdout->_flag&_IOLBF)
+         fflush(stdout);
+       if (stderr->_flag&_IOLBF)
+         fflush(stderr);
+     }
+   
+   /* don't read too much! */
+   //if (f->_fillsize > f->_bufsiz)
+   //  f->_fillsize = f->_bufsiz;
+   
+   /* This next bit makes it so that the cumulative amount read always
+    aligns with file cluster boundaries; i.e. 512, then 2048
+    (512+1536), then 4096 (2048+2048) etc. */
+   //fillsize = f->_fillsize;
+  //if (fillsize == 1024 && f->_bufsiz >= 1536)
+  //  fillsize = 1536;
+   
+   if (f->_flag & _IONBF)
+     {
+       f->_cnt = read(fileno(f), f->_base, 1);
+     }
+   else
+     {
+       f->_cnt = read(fileno(f), f->_base, size);
+     }
 
-  if ((f->_flag&_IOREAD) == 0)
+   if ((f->_flag&_IOREAD) == 0)
     return EOF;
   if (f->_flag&(_IOSTRG|_IOEOF))
     return EOF;
index 0f10098..c4c8459 100644 (file)
@@ -7,52 +7,57 @@
 #include <crtdll/internal/file.h>
 
 
-size_t
-fread(void *vptr, size_t size, size_t count, FILE *iop)
+size_t fread(void *vptr, size_t size, size_t count, FILE *iop)
 {
-  char *ptr = (char *)vptr;
-  int s;
-  int c;
+   char *ptr = (char *)vptr;
+   int s;
+   int c;
+   
+   /* 
+    * grow if we know we're asking for a lot, even if it's in the
+    * buffer, since we'll probably read chunks this size for a while 
+    */
+   while (size*count > iop->_fillsize
+         && iop->_fillsize < iop->_bufsiz)
+     {
+       if (iop->_fillsize < 512)
+         iop->_fillsize = 512;
+       iop->_fillsize *= 2;
+     }
 
-  /* grow if we know we're asking for a lot, even if it's in the
-     buffer, since we'll probably read chunks this size for a while */
-  while (size*count > iop->_fillsize
-        && iop->_fillsize < iop->_bufsiz)
-  {
-    if (iop->_fillsize < 512)
-      iop->_fillsize = 512;
-    iop->_fillsize *= 2;
-  }
-
-  s = size * count;
-  if(!__is_text_file(iop))
-  {
-    while (s > 0) {
-      if (iop->_cnt < s) {
-       if (iop->_cnt > 0) {
-         memcpy(ptr, iop->_ptr, iop->_cnt);
-         ptr += iop->_cnt;
-         s -= iop->_cnt;
-       }
-       /*
-        * filbuf clobbers _cnt & _ptr,
-        * so don't waste time setting them.
-        */
-       if ((c = _filbuf(iop)) == EOF)
-         break;
-       *ptr++ = c;
-       s--;
-      }
-      if (iop->_cnt >= s) {
-       memcpy(ptr, iop->_ptr, s);
-       iop->_ptr += s;
-       iop->_cnt -= s;
-       return count;
-      }
-    }
-  }
-  else
-  {
+   s = size * count;
+   if(!__is_text_file(iop))
+     {
+       while (s > 0) 
+         {
+            if (iop->_cnt < s) 
+              {
+                 if (iop->_cnt > 0) 
+                   {
+                      memcpy(ptr, iop->_ptr, iop->_cnt);
+                      ptr += iop->_cnt;
+                      s -= iop->_cnt;
+                   }
+                 /*
+                  * filbuf clobbers _cnt & _ptr,
+                  * so don't waste time setting them.
+                  */
+                 if ((c = _filbuf(iop)) == EOF)
+                   break;
+                 *ptr++ = c;
+                 s--;
+              }
+            if (iop->_cnt >= s) 
+              {
+                 memcpy(ptr, iop->_ptr, s);
+                 iop->_ptr += s;
+                 iop->_cnt -= s;
+                 return count;
+              }
+         }
+     }
+   else
+     {
     while (s > 0) {
       if (iop->_cnt < s) {
        while (iop->_cnt > 0) {
index d851e0f..f8d5cbb 100644 (file)
@@ -8,49 +8,50 @@
 #include <crtdll/io.h>
 
 
-int
-fseek(FILE *f, long offset, int ptrname)
+int fseek(FILE *f, long offset, int ptrname)
 {
-  long p = -1;                 /* can't happen? */
-
+   long p = -1;                        /* can't happen? */
+   
   /* See comment in filbuf.c */
-  f->_fillsize = 512;
-
-  f->_flag &= ~_IOEOF;
-  if (f->_flag & _IOREAD)
-  {
-    if (f->_base && !(f->_flag & _IONBF))
-    {
-      p = ftell(f);
-      if (ptrname == SEEK_CUR)
-      {
-       offset += p;
-       ptrname = SEEK_SET;
-      }
-      /* check if the target position is in the buffer and
-        optimize seek by moving inside the buffer */
-      if (ptrname == SEEK_SET && (f->_flag & (_IOUNGETC|_IORW)) == 0
-      && p-offset <= f->_ptr-f->_base && offset-p <= f->_cnt)
-      {
-        f->_ptr+=offset-p;
-        f->_cnt+=p-offset;
-        return 0;
-      }
-    }
-
-    if (f->_flag & _IORW)
-      f->_flag &= ~_IOREAD;
+   f->_fillsize = 512;
 
-    p = lseek(fileno(f), offset, ptrname);
-    f->_cnt = 0;
-    f->_ptr = f->_base;
-    f->_flag &= ~_IOUNGETC;
-  }
-  else if (f->_flag & (_IOWRT|_IORW))
-  {
-    p = fflush(f);
-    return lseek(fileno(f), offset, ptrname) == -1 || p == EOF ?
-      -1 : 0;
-  }
-  return p==-1 ? -1 : 0;
+   f->_flag &= ~_IOEOF;
+   if (f->_flag & _IOREAD)
+     {
+       if (f->_base && !(f->_flag & _IONBF))
+         {
+            p = ftell(f);
+            if (ptrname == SEEK_CUR)
+              {
+                 offset += p;
+                 ptrname = SEEK_SET;
+              }
+            /* check if the target position is in the buffer and
+             optimize seek by moving inside the buffer */
+            if (ptrname == SEEK_SET && (f->_flag & (_IOUNGETC|_IORW)) == 0
+                && p-offset <= f->_ptr-f->_base && offset-p <= f->_cnt)
+              {
+                 f->_ptr+=offset-p;
+                 f->_cnt+=p-offset;
+                 return 0;
+              }
+         }
+       
+       if (f->_flag & _IORW)
+         f->_flag &= ~_IOREAD;
+       
+       p = lseek(fileno(f), offset, ptrname);
+       f->_cnt = 0;
+       f->_ptr = f->_base;
+       f->_flag &= ~_IOUNGETC;
+     }
+   else if (f->_flag & (_IOWRT|_IORW))
+     {
+       p = fflush(f);
+       f->_cnt = 0;
+       f->_ptr = f->_base = NULL;
+       f->_flag &= ~_IOUNGETC;
+       return lseek(fileno(f), offset, ptrname) == -1 || p == EOF ? -1 : 0;
+     }
+   return p==-1 ? -1 : 0;
 }
index 3c9e636..3bbb0a5 100644 (file)
@@ -17,7 +17,7 @@
 #include <wchar.h>
 #include <string.h>
 
-//#define NDEBUG
+#define NDEBUG
 #include <kernel32/kernel32.h>
 
 /* EXTERNS ******************************************************************/
diff --git a/reactos/lib/kernel32/mem/section.c b/reactos/lib/kernel32/mem/section.c
new file mode 100644 (file)
index 0000000..f02a598
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * COPYRIGHT:            See COPYING in the top level directory
+ * PROJECT:              ReactOS kernel
+ * FILE:                 lib/kernel32/mem/section.c
+ * PURPOSE:              Implementing file mapping
+ * PROGRAMMER:           David Welch (welch@mcmail.com)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <windows.h>
+#include <ddk/ntddk.h>
+
+/* FUNCTIONS *****************************************************************/
+
+HANDLE CreationFileMappingA(HANDLE hFile,
+                           LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
+                           DWORD flProtect,
+                           DWORD dwMaximumSizeHigh,
+                           DWORD dwMaximumSizeLow,
+                           LPCSTR lpName)
+{
+   NTSTATUS Status;
+   HANDLE SectionHandle;
+   LARGE_INTEGER MaximumSize;
+   OBJECT_ATTRIBUTES ObjectAttributes;
+   ANSI_STRING AnsiName;
+   UNICODE_STRING UnicodeName;
+   
+   SET_LARGE_INTEGER_LOW_PART(MaximumSize, dwMaximumSizeLow);
+   SET_LARGE_INTEGER_HIGH_PART(MaximumSize, dwMaximumSizeHigh);
+   RtlInitAnsiString(&AnsiString, lpName);
+   RtlAnsiStringToUnicodeString(&UnicodeName, &AnsiName, TRUE);
+   InitializeObjectAttributes(&ObjectAttributes,
+                             &UnicodeName,
+                             0,
+                             NULL,
+                             lpFileMappingAttributes);
+   Status = ZwCreateSection(&SectionHandle,
+                           SECTION_ALL_ACCESS,
+                           &ObjectAttributes,
+                           &MaximumSize,
+                           flProtect,
+                           0,
+                           hFile);
+   if (!NT_SUCCESS(Status))
+     {
+       return(SectionHandle);
+     }
+   return(NULL);
+}
+
+HANDLE CreationFileMappingW(HANDLE hFile,
+                           LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
+                           DWORD flProtect,
+                           DWORD dwMaximumSizeHigh,
+                           DWORD dwMaximumSizeLow,
+                           LPCWSTR lpName)
+{
+   NTSTATUS Status;
+   HANDLE SectionHandle;
+   LARGE_INTEGER MaximumSize;
+   OBJECT_ATTRIBUTES ObjectAttributes;
+   UNICODE_STRING UnicodeName;
+   
+   SET_LARGE_INTEGER_LOW_PART(MaximumSize, dwMaximumSizeLow);
+   SET_LARGE_INTEGER_HIGH_PART(MaximumSize, dwMaximumSizeHigh);
+   RtlInitUnicodeString(&UnicodeString, lpName);
+   InitializeObjectAttributes(&ObjectAttributes,
+                             &UnicodeName,
+                             0,
+                             NULL,
+                             lpFileMappingAttributes);
+   Status = ZwCreateSection(&SectionHandle,
+                           SECTION_ALL_ACCESS,
+                           &ObjectAttributes,
+                           &MaximumSize,
+                           flProtect,
+                           0,
+                           hFile);
+   if (!NT_SUCCESS(Status))
+     {
+       return(SectionHandle);
+     }
+   return(NULL);
+}
+
+LPVOID MapViewOfFileEx(HANDLE hFileMappingObject,
+                      DWORD dwDesiredAccess,
+                      DWORD dwFileOffsetHigh,
+                      DWORD dwFileOffsetLow,
+                      DWORD dwNumberOfBytesToMap,
+                      LPVOID lpBaseAddress)
+{
+   NTSTATUS Status;
+   
+   Status = ZwMapViewOfSection(hFileMappingObject,
+                              NtCurrentProcess(),
+                              &lpBaseAddress,
+                              0,
+                              dwNumberOfBytesToMap,
+                              
+}
index 482272c..a281e9b 100644 (file)
@@ -21,7 +21,7 @@
 #include <ntdll/ldr.h>
 #include <internal/teb.h>
 
-//#define NDEBUG
+#define NDEBUG
 #include <kernel32/kernel32.h>
 
 /* FUNCTIONS ****************************************************************/
index 6597973..000cf7c 100644 (file)
@@ -18,7 +18,7 @@
 #include <ntdll/ldr.h>
 #include <ntdll/rtl.h>
 
-//#define NDEBUG
+#define NDEBUG
 #include <ntdll/ntdll.h>
 
 /* GLOBALS *******************************************************************/
@@ -84,7 +84,7 @@ VOID LdrStartup(HANDLE SectionHandle,
    NTSTATUS Status;
    PIMAGE_NT_HEADERS NTHeaders;
    
-   dprintf("LdrStartup(ImageBase %x, SectionHandle %x, "
+   DPRINT("LdrStartup(ImageBase %x, SectionHandle %x, "
           "NTDllSectionHandle %x)\n",ImageBase,
           SectionHandle, NTDllSectionHandle);
    
index 8428805..62613b8 100644 (file)
@@ -44,7 +44,7 @@ static NTSTATUS LdrLoadDll(PDLL* Dll, PCHAR Name)
    HANDLE FileHandle, SectionHandle;
    PDLLMAIN_FUNC Entrypoint;
    
-   dprintf("LdrLoadDll(Base %x, Name %s)\n",Dll,Name);
+   DPRINT("LdrLoadDll(Base %x, Name %s)\n",Dll,Name);
    
    strcat(fqname, Name);
    
@@ -140,9 +140,9 @@ static NTSTATUS LdrLoadDll(PDLL* Dll, PCHAR Name)
    Entrypoint = (PDLLMAIN_FUNC)LdrPEStartup(ImageBase, SectionHandle);
    if (Entrypoint != NULL)
      {
-       dprintf("Calling entry point at %x\n",Entrypoint);
+       DPRINT("Calling entry point at %x\n",Entrypoint);
        Entrypoint(ImageBase, DLL_PROCESS_ATTACH, NULL);
-       dprintf("Successful called entrypoint\n");
+       DPRINT("Successful called entrypoint\n");
      }
    
    return(STATUS_SUCCESS);
index 98ee9f3..36d2e6c 100644 (file)
@@ -38,7 +38,7 @@ FS_DRIVERS = minix vfat ext2
 # FS_DRIVERS = template
 KERNEL_SERVICES = $(DEVICE_DRIVERS) $(FS_DRIVERS)
                  
-APPS = args hello shell test cat
+APPS = args hello shell test cat bench
 # APPS = cmd
 
 all: $(COMPONENTS) $(DLLS) $(LOADERS) $(KERNEL_SERVICES) $(APPS)
index d5a7c92..dc06b4c 100644 (file)
@@ -233,8 +233,6 @@ asmlinkage void exception_handler(unsigned int edi,
        DbgPrint("ESP %.8x\n",esp);
      }
    
-   for(;;);
-   
   if ((cs & 0xffff) == KERNEL_CS)
     {
       DbgPrint("ESP %x\n",esp);
@@ -290,6 +288,12 @@ asmlinkage void exception_handler(unsigned int edi,
         }
      }
    
+   if ((cs&0xffff) == USER_CS)
+     {
+       ZwTerminateProcess(NtCurrentProcess(),
+                          STATUS_NONCONTINUABLE_EXCEPTION);
+     }
+   
    for(;;);
 }
 
index f84d1c3..aa962f0 100644 (file)
@@ -158,7 +158,7 @@ VOID MmDeletePageEntry(PEPROCESS Process, PVOID Address, BOOL FreePage)
        return;
      }
    page_tlb = ADDR_TO_PTE(Address);
-   if (FreePage)
+   if (FreePage && PAGE_MASK(*page_tlb) != 0)
      {
        MmFreePage(PAGE_MASK(*page_tlb),1);
      }
index 4003f7a..c820639 100644 (file)
@@ -262,40 +262,41 @@ PIRP IoBuildDeviceIoControlRequest(ULONG IoControlCode,
 
    switch (IO_METHOD_FROM_CTL_CODE(IoControlCode))
    {
-      case METHOD_BUFFERED:
-         DPRINT("Using METHOD_BUFFERED!\n");
-
-         BufferLength = (InputBufferLength>OutputBufferLength)?InputBufferLength:OutputBufferLength;
-         if (BufferLength)
+    case METHOD_BUFFERED:
+      DPRINT("Using METHOD_BUFFERED!\n");
+      
+      BufferLength = (InputBufferLength>OutputBufferLength)?InputBufferLength:OutputBufferLength;
+      if (BufferLength)
          {
             Irp->AssociatedIrp.SystemBuffer = (PVOID)
-               ExAllocatePool(NonPagedPool,BufferLength);
-
+             ExAllocatePool(NonPagedPool,BufferLength);
+           
             if (Irp->AssociatedIrp.SystemBuffer==NULL)
-            {
-               IoFreeIrp(Irp);
-               return(NULL);
-            }
-         }
-
-         if (InputBuffer && InputBufferLength)
-         {
-            RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
-                  InputBuffer,
-                  InputBufferLength);
+             {
+                IoFreeIrp(Irp);
+                return(NULL);
+             }
          }
-         break;
-
-      case METHOD_IN_DIRECT:
-         DPRINT("Using METHOD_IN_DIRECT!\n");
-
-         /* build input buffer (control buffer) */
-         if (InputBuffer && InputBufferLength)
-         {
-            Irp->AssociatedIrp.SystemBuffer = (PVOID)
+      
+      if (InputBuffer && InputBufferLength)
+       {
+          RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
+                        InputBuffer,
+                        InputBufferLength);
+       }
+      Irp->UserBuffer = OutputBuffer;
+      break;
+
+    case METHOD_IN_DIRECT:
+      DPRINT("Using METHOD_IN_DIRECT!\n");
+      
+      /* build input buffer (control buffer) */
+      if (InputBuffer && InputBufferLength)
+       {
+          Irp->AssociatedIrp.SystemBuffer = (PVOID)
                ExAllocatePool(NonPagedPool,InputBufferLength);
-
-            if (Irp->AssociatedIrp.SystemBuffer==NULL)
+          
+          if (Irp->AssociatedIrp.SystemBuffer==NULL)
             {
                IoFreeIrp(Irp);
                return(NULL);
@@ -337,8 +338,12 @@ PIRP IoBuildDeviceIoControlRequest(ULONG IoControlCode,
          /* build output buffer (data transfer buffer) */
          if (OutputBuffer && OutputBufferLength)
          {
-            Irp->MdlAddress = IoAllocateMdl (OutputBuffer,OutputBufferLength,FALSE,FALSE,Irp);
-            MmProbeAndLockPages (Irp->MdlAddress,UserMode,IoWriteAccess);
+            Irp->MdlAddress = IoAllocateMdl(OutputBuffer,
+                                           OutputBufferLength,
+                                           FALSE,
+                                           FALSE,
+                                           Irp);
+            MmProbeAndLockPages(Irp->MdlAddress,UserMode,IoWriteAccess);
          }
          break;
 
index 6121532..8cc459b 100644 (file)
 
 /* FUNCTIONS ***************************************************************/
 
+
+VOID IoDeviceControlCompletion(PDEVICE_OBJECT DeviceObject,
+                              PIRP Irp,
+                              PIO_STACK_LOCATION IoStack)
+{
+   ULONG IoControlCode;
+   
+   IoControlCode = IoStack->Parameters.DeviceIoControl.IoControlCode;
+   
+   switch (IO_METHOD_FROM_CTL_CODE(IoControlCode))
+     {
+      case METHOD_BUFFERED:
+       DPRINT ("Using METHOD_BUFFERED!\n");
+       
+       /* copy output buffer back and free it */
+       if (Irp->AssociatedIrp.SystemBuffer)
+         {
+            if (IoStack->Parameters.DeviceIoControl.OutputBufferLength)
+              {
+                 RtlCopyMemory(Irp->UserBuffer,
+                               Irp->AssociatedIrp.SystemBuffer,
+                               IoStack->Parameters.DeviceIoControl.
+                               OutputBufferLength);
+              }
+            ExFreePool (Irp->AssociatedIrp.SystemBuffer);
+         }
+       break;
+       
+      case METHOD_IN_DIRECT:
+       DPRINT ("Using METHOD_IN_DIRECT!\n");
+       
+       /* free input buffer (control buffer) */
+       if (Irp->AssociatedIrp.SystemBuffer)
+         ExFreePool (Irp->AssociatedIrp.SystemBuffer);
+       
+       /* free output buffer (data transfer buffer) */
+       if (Irp->MdlAddress)
+         IoFreeMdl (Irp->MdlAddress);
+       break;
+       
+      case METHOD_OUT_DIRECT:
+       DPRINT ("Using METHOD_OUT_DIRECT!\n");
+       
+       /* free input buffer (control buffer) */
+       if (Irp->AssociatedIrp.SystemBuffer)
+         ExFreePool (Irp->AssociatedIrp.SystemBuffer);
+       
+       /* free output buffer (data transfer buffer) */
+       if (Irp->MdlAddress)
+         IoFreeMdl (Irp->MdlAddress);
+       break;
+       
+      case METHOD_NEITHER:
+       DPRINT ("Using METHOD_NEITHER!\n");
+       /* nothing to do */
+       break;
+     }
+}
+
 VOID IoReadWriteCompletion(PDEVICE_OBJECT DeviceObject,
                           PIRP Irp,
                           PIO_STACK_LOCATION IoStack)
@@ -59,6 +118,12 @@ VOID IoReadWriteCompletion(PDEVICE_OBJECT DeviceObject,
      }
 }
 
+VOID IoVolumeInformationCompletion(PDEVICE_OBJECT DeviceObject,
+                                  PIRP Irp,
+                                  PIO_STACK_LOCATION IoStack)
+{
+}
+
 VOID IoSecondStageCompletion(PIRP Irp, CCHAR PriorityBoost)
 /*
  * FUNCTION: Performs the second stage of irp completion for read/write irps
@@ -78,7 +143,8 @@ VOID IoSecondStageCompletion(PIRP Irp, CCHAR PriorityBoost)
    switch (IoStack->MajorFunction)
      {
       case IRP_MJ_CREATE:
-       /* NOP */
+      case IRP_MJ_FLUSH_BUFFERS:
+         /* NOP */
        break;
        
       case IRP_MJ_READ:
@@ -86,6 +152,16 @@ VOID IoSecondStageCompletion(PIRP Irp, CCHAR PriorityBoost)
        IoReadWriteCompletion(DeviceObject,Irp,IoStack);
        break;
        
+      case IRP_MJ_DEVICE_CONTROL:
+      case IRP_MJ_INTERNAL_DEVICE_CONTROL:
+       IoDeviceControlCompletion(DeviceObject, Irp, IoStack);
+       break;
+       
+      case IRP_MJ_QUERY_VOLUME_INFORMATION:
+      case IRP_MJ_SET_VOLUME_INFORMATION:
+       IoVolumeInformationCompletion(DeviceObject, Irp, IoStack);
+       break;
+       
       default:
      }
 
index 15b279a..5a4053b 100644 (file)
@@ -13,7 +13,7 @@
 #include <ddk/ntddk.h>
 #include <internal/io.h>
 
-//#define NDEBUG
+#define NDEBUG
 #include <internal/debug.h>
 
 /* FUNCTIONS *****************************************************************/
index 2793457..27ca0fc 100644 (file)
@@ -3,7 +3,7 @@
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/io/flush.c
  * PURPOSE:         Flushing file buffer
- * PROGRAMMER:      David Welch (welch@mcmail.com)
+ * PROGRAMMER:      David Welch (welch@cwcom.net)
  * UPDATE HISTORY:
  *                  Created 22/05/98
  */
index 370764d..cb4aafd 100644 (file)
@@ -58,90 +58,101 @@ NtFsControlFile(
                          OutputBufferSize));
 }
 
-NTSTATUS
-STDCALL
-ZwFsControlFile(
-       IN HANDLE DeviceHandle,
-       IN HANDLE EventHandle OPTIONAL, 
-       IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, 
-       IN PVOID ApcContext OPTIONAL, 
-       OUT PIO_STATUS_BLOCK IoStatusBlock, 
-       IN ULONG IoControlCode,
-       IN PVOID InputBuffer, 
-       IN ULONG InputBufferSize,
-       OUT PVOID OutputBuffer,
-       IN ULONG OutputBufferSize
-       )
+NTSTATUS STDCALL ZwFsControlFile(IN HANDLE DeviceHandle,
+                                IN HANDLE EventHandle OPTIONAL, 
+                                IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, 
+                                IN PVOID ApcContext OPTIONAL, 
+                                OUT PIO_STATUS_BLOCK IoStatusBlock, 
+                                IN ULONG IoControlCode,
+                                IN PVOID InputBuffer, 
+                                IN ULONG InputBufferSize,
+                                OUT PVOID OutputBuffer,
+                                IN ULONG OutputBufferSize)
 {
    NTSTATUS Status = -1;
    PFILE_OBJECT FileObject;
    PIRP Irp;
    PIO_STACK_LOCATION StackPtr;
    KEVENT Event;
-
-   if ( InputBufferSize > 0 ) { 
    
+   if (InputBufferSize > 0)
+     {
        Status = ObReferenceObjectByHandle(DeviceHandle,
-                                     FILE_WRITE_DATA|FILE_READ_DATA,
-                                     NULL,
-                                     UserMode,
-                                     (PVOID *) &FileObject,
-                                     NULL);
+                                          FILE_WRITE_DATA|FILE_READ_DATA,
+                                          NULL,
+                                          UserMode,
+                                          (PVOID *) &FileObject,
+                                          NULL);
        if (Status != STATUS_SUCCESS)
-       {
+         {
                return(Status);
-       }
-   
+         }
+       
        KeInitializeEvent(&Event,NotificationEvent,FALSE);
        Irp = IoBuildSynchronousFsdRequest(IRP_MJ_DEVICE_CONTROL,
-                                     FileObject->DeviceObject,
-                                     InputBuffer,
-                                     InputBufferSize,
-                                     0,
-                                     &Event,
-                                     IoStatusBlock);
+                                          FileObject->DeviceObject,
+                                          InputBuffer,
+                                          InputBufferSize,
+                                          0,
+                                          &Event,
+                                          IoStatusBlock);
+       if (Irp == NULL)
+         {
+            ObDereferenceObject(FileObject);
+            return(STATUS_UNSUCCESSFUL);
+         }
        StackPtr = IoGetNextIrpStackLocation(Irp);
-       if ( StackPtr == NULL )
-               return -1;
+       if (StackPtr == NULL)
+         {
+            ObDereferenceObject(FileObject);
+            return(STATUS_UNSUCCESSFUL);
+         }
        StackPtr->Parameters.DeviceIoControl.IoControlCode = IoControlCode;
        StackPtr->FileObject = FileObject;
        StackPtr->Parameters.Write.Length = InputBufferSize;
        DPRINT("FileObject->DeviceObject %x\n",FileObject->DeviceObject);
        Status = IoCallDriver(FileObject->DeviceObject,Irp);
        if (Status==STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
-       {
-               KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
-               return Irp->IoStatus.Status;
-       }
+         {
+            KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
+         }
+       ObDereferenceObject(FileObject);
+       return(Irp->IoStatus.Status);
   }
 
-  if ( OutputBufferSize > 0 ) { 
+  if (OutputBufferSize > 0) 
+     {
        CHECKPOINT;
        Status = ObReferenceObjectByHandle(DeviceHandle,
-                                     FILE_WRITE_DATA|FILE_READ_DATA,
-                                     NULL,
-                                     UserMode,
-                                     (PVOID *) &FileObject,
-                                     NULL);
+                                          FILE_WRITE_DATA|FILE_READ_DATA,
+                                          NULL,
+                                          UserMode,
+                                          (PVOID *) &FileObject,
+                                          NULL);
        if (Status != STATUS_SUCCESS)
-       {
-               return(Status);
-       }
+         {
+            return(Status);
+         }
        CHECKPOINT;
        KeInitializeEvent(&Event,NotificationEvent,FALSE);
        CHECKPOINT;
        Irp = IoBuildSynchronousFsdRequest(IRP_MJ_DEVICE_CONTROL,
-                                     FileObject->DeviceObject,
-                                     OutputBuffer,
-                                     OutputBufferSize,
-                                     0,
-                                     &Event,
-                                     IoStatusBlock);
-       CHECKPOINT;
+                                          FileObject->DeviceObject,
+                                          OutputBuffer,
+                                          OutputBufferSize,
+                                          0,
+                                          &Event,
+                                          IoStatusBlock);
+       if (Irp == NULL)
+         {
+            ObDereferenceObject(FileObject);
+            return(STATUS_UNSUCCESSFUL);
+         }
        StackPtr = IoGetNextIrpStackLocation(Irp);
-       if ( StackPtr == NULL )
-               return -1;
+       if (StackPtr == NULL)
+         {
+            return(STATUS_UNSUCCESSFUL);
+         }
        StackPtr->Parameters.DeviceIoControl.IoControlCode = IoControlCode;
        StackPtr->FileObject = FileObject;
        StackPtr->Parameters.Read.Length = OutputBufferSize;
@@ -149,11 +160,10 @@ ZwFsControlFile(
        Status = IoCallDriver(FileObject->DeviceObject,Irp);
        if (Status==STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
        {
-               KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
-               return Irp->IoStatus.Status;
+          KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
        }
+       return(Irp->IoStatus.Status);
    }
-   CHECKPOINT;
    return(Status);
 }
 
index 6a60992..2150760 100644 (file)
@@ -25,51 +25,43 @@ ULONG IoGetFunctionCodeFromCtlCode(ULONG ControlCode)
    UNIMPLEMENTED;
 }
 
-NTSTATUS
-STDCALL
-NtDeviceIoControlFile(
-    IN HANDLE DeviceHandle,
-    IN HANDLE Event OPTIONAL,
-    IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
-    IN PVOID UserApcContext OPTIONAL,
-    OUT PIO_STATUS_BLOCK IoStatusBlock,
-    IN ULONG IoControlCode,
-    IN PVOID InputBuffer,
-    IN ULONG InputBufferSize,
-    OUT PVOID OutputBuffer,
-    IN ULONG OutputBufferSize
-    )
+NTSTATUS STDCALL NtDeviceIoControlFile(IN HANDLE DeviceHandle,
+                                      IN HANDLE Event OPTIONAL,
+                                      IN PIO_APC_ROUTINE UserApcRoutine,
+                                      IN PVOID UserApcContext OPTIONAL,
+                                      OUT PIO_STATUS_BLOCK IoStatusBlock,
+                                      IN ULONG IoControlCode,
+                                      IN PVOID InputBuffer,
+                                      IN ULONG InputBufferSize,
+                                      OUT PVOID OutputBuffer,
+                                      IN ULONG OutputBufferSize)
 {
     return(ZwDeviceIoControlFile(DeviceHandle,
-            Event,
-            UserApcRoutine,
-            UserApcContext,
-            IoStatusBlock,
-            IoControlCode,
-            InputBuffer,
-            InputBufferSize,
-            OutputBuffer,
-            OutputBufferSize));
+                                Event,
+                                UserApcRoutine,
+                                UserApcContext,
+                                IoStatusBlock,
+                                IoControlCode,
+                                InputBuffer,
+                                InputBufferSize,
+                                OutputBuffer,
+                                OutputBufferSize));
 }
 
 /*
  * NOTES: No apc support yet!
  */
 
-NTSTATUS
-STDCALL
-ZwDeviceIoControlFile(
-    IN HANDLE DeviceHandle,
-    IN HANDLE Event OPTIONAL,
-    IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
-    IN PVOID UserApcContext OPTIONAL,
-    OUT PIO_STATUS_BLOCK IoStatusBlock,
-    IN ULONG IoControlCode,
-    IN PVOID InputBuffer,
-    IN ULONG InputBufferSize,
-    OUT PVOID OutputBuffer,
-    IN ULONG OutputBufferSize
-    )
+NTSTATUS STDCALL ZwDeviceIoControlFile(IN HANDLE DeviceHandle,
+                                      IN HANDLE Event OPTIONAL,
+                                      IN PIO_APC_ROUTINE UserApcRoutine,
+                                      IN PVOID UserApcContext OPTIONAL,
+                                      OUT PIO_STATUS_BLOCK IoStatusBlock,
+                                      IN ULONG IoControlCode,
+                                      IN PVOID InputBuffer,
+                                      IN ULONG InputBufferSize,
+                                      OUT PVOID OutputBuffer,
+                                      IN ULONG OutputBufferSize)
 {
    NTSTATUS Status;
    PFILE_OBJECT FileObject;
@@ -79,19 +71,19 @@ ZwDeviceIoControlFile(
    KEVENT KEvent;
    
    assert(KeGetCurrentIrql()==PASSIVE_LEVEL);
-
+   
    DPRINT("ZwDeviceIoControlFile(DeviceHandle %x Event %x UserApcRoutine %x "
           "UserApcContext %x IoStatusBlock %x InputBuffer %x "
           "InputBufferSize %x OutputBuffer %x OutputBufferSize %x)\n",
           DeviceHandle,Event,UserApcRoutine,UserApcContext,IoStatusBlock,
           InputBuffer,InputBufferSize,OutputBuffer,OutputBufferSize);
-
+   
    Status = ObReferenceObjectByHandle(DeviceHandle,
-                      FILE_READ_DATA | FILE_WRITE_DATA,
-                      NULL,
-                      KernelMode,
-                      (PVOID *) &FileObject,
-                      NULL);
+                                     FILE_READ_DATA | FILE_WRITE_DATA,
+                                     NULL,
+                                     KernelMode,
+                                     (PVOID *) &FileObject,
+                                     NULL);
 
    if (Status != STATUS_SUCCESS)
    {
@@ -104,75 +96,26 @@ ZwDeviceIoControlFile(
    KeInitializeEvent(&KEvent,NotificationEvent,TRUE);
 
    Irp = IoBuildDeviceIoControlRequest(IoControlCode,
-                      DeviceObject,
-                      InputBuffer,
-                      InputBufferSize,
-                      OutputBuffer,
-                      OutputBufferSize,
-                      FALSE,
-                      &KEvent,
-                      IoStatusBlock);
-
+                                      DeviceObject,
+                                      InputBuffer,
+                                      InputBufferSize,
+                                      OutputBuffer,
+                                      OutputBufferSize,
+                                      FALSE,
+                                      &KEvent,
+                                      IoStatusBlock);
+   
    StackPtr = IoGetNextIrpStackLocation(Irp);
    StackPtr->DeviceObject = DeviceObject;
    StackPtr->Parameters.DeviceIoControl.InputBufferLength = InputBufferSize;
    StackPtr->Parameters.DeviceIoControl.OutputBufferLength = OutputBufferSize;
 
    Status = IoCallDriver(DeviceObject,Irp);
-   if (Status == STATUS_PENDING)
+   if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
    {
       KeWaitForSingleObject(&KEvent,Executive,KernelMode,FALSE,NULL);
       return(IoStatusBlock->Status);
    }
-
-   switch  (IO_METHOD_FROM_CTL_CODE(IoControlCode))
-   {
-      case METHOD_BUFFERED:
-         DPRINT ("Using METHOD_BUFFERED!\n");
-
-         /* copy output buffer back and free it */
-         if (Irp->AssociatedIrp.SystemBuffer)
-         {
-            if (OutputBuffer && OutputBufferSize)
-            {
-               RtlCopyMemory(OutputBuffer,
-                          Irp->AssociatedIrp.SystemBuffer,
-                          OutputBufferSize);
-            }
-            ExFreePool (Irp->AssociatedIrp.SystemBuffer);
-         }
-         break;
-
-      case METHOD_IN_DIRECT:
-         DPRINT ("Using METHOD_IN_DIRECT!\n");
-
-         /* free input buffer (control buffer) */
-         if (Irp->AssociatedIrp.SystemBuffer)
-            ExFreePool (Irp->AssociatedIrp.SystemBuffer);
-
-         /* free output buffer (data transfer buffer) */
-         if (Irp->MdlAddress)
-            IoFreeMdl (Irp->MdlAddress);
-         break;
-
-      case METHOD_OUT_DIRECT:
-         DPRINT ("Using METHOD_OUT_DIRECT!\n");
-
-         /* free input buffer (control buffer) */
-         if (Irp->AssociatedIrp.SystemBuffer)
-            ExFreePool (Irp->AssociatedIrp.SystemBuffer);
-
-         /* free output buffer (data transfer buffer) */
-         if (Irp->MdlAddress)
-            IoFreeMdl (Irp->MdlAddress);
-         break;
-
-      case METHOD_NEITHER:
-         DPRINT ("Using METHOD_NEITHER!\n");
-         /* nothing to do */
-         break;
-   }
-
    return(Status);
 }
 
index fb9b6ae..968c81d 100644 (file)
@@ -63,7 +63,7 @@ NTSTATUS ZwReadFile(HANDLE FileHandle,
    
    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,
@@ -77,6 +77,9 @@ NTSTATUS ZwReadFile(HANDLE FileHandle,
        return(Status);
      }
    
+   DPRINT("ByteOffset %x FileObject->CurrentByteOffset %d\n",
+         ByteOffset,
+         GET_LARGE_INTEGER_LOW_PART(FileObject->CurrentByteOffset));
    if (ByteOffset==NULL)
      {
        ByteOffset = &(FileObject->CurrentByteOffset);
@@ -125,8 +128,9 @@ NTSTATUS ZwReadFile(HANDLE FileHandle,
    if (Status == STATUS_PENDING  && (FileObject->Flags & FO_SYNCHRONOUS_IO))
      {
        KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
-       return(IoStatusBlock->Status);
+       Status = IoStatusBlock->Status;
      }
+   DPRINT("ZwReadFile() = %x\n",Status);
    return(Status);
 }
 
@@ -205,7 +209,7 @@ NTSTATUS ZwWriteFile(HANDLE FileHandle,
         StackPtr->Parameters.Write.Key = 0;
    }
    Status = IoCallDriver(FileObject->DeviceObject,Irp);
-   if (Status==STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
+   if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
      {
        KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
         Status = Irp->IoStatus.Status;
index 9209abb..c7049ce 100644 (file)
@@ -165,6 +165,7 @@ NTSTATUS ZwQuerySymbolicLinkObject(IN HANDLE LinkHandle,
      {
        *ReturnedLength=SymlinkObject->Target.Length;
      }
+   ObDereferenceObject(SymlinkObject);
    return(STATUS_SUCCESS);
 }
 
index 31dee72..399b90e 100644 (file)
@@ -124,6 +124,7 @@ BOOLEAN KeDispatcherObjectWake(DISPATCHER_HEADER* hdr)
    DPRINT("Entering KeDispatcherObjectWake(hdr %x)\n",hdr);
 //   DPRINT("hdr->WaitListHead %x hdr->WaitListHead.Flink %x\n",
 //       &hdr->WaitListHead,hdr->WaitListHead.Flink);
+   DPRINT("hdr->Type %x\n",hdr->Type);
    switch (hdr->Type)
      {
       case NotificationEvent:
@@ -148,10 +149,10 @@ BOOLEAN KeDispatcherObjectWake(DISPATCHER_HEADER* hdr)
        }
        else return FALSE;
        
-      case ProcessType:
+      case ID_PROCESS_OBJECT:
        return(KeDispatcherObjectWakeAll(hdr));
      }
-   DbgPrint("Dispatcher object has unknown type\n");
+   DbgPrint("Dispatcher object %x has unknown type\n",hdr);
    KeBugCheck(0);
    return(FALSE);
 }
@@ -196,6 +197,18 @@ NTSTATUS KeWaitForSingleObject(PVOID Object,
           
         case SemaphoreType:
           break;
+          
+        case ID_PROCESS_OBJECT:
+          break;
+          
+        case NotificationEvent:
+          break;
+          
+        default:
+          DbgPrint("(%s:%d) Dispatcher object %x has unknown type\n",
+                   __FILE__,__LINE__,hdr);
+          KeBugCheck(0);
+          
        }
       KeReleaseDispatcherDatabaseLock(FALSE);
       return(STATUS_SUCCESS);
index c5c38b8..8dbea13 100644 (file)
@@ -60,7 +60,8 @@ NTSTATUS MmpCreateSection(PVOID ObjectBody,
      }
    
    ObAddEntryDirectory(Parent, ObjectBody, RemainingPath+1);
-     
+   ObDereferenceObject(Parent);
+   
    return(STATUS_SUCCESS);
 }
 
@@ -326,6 +327,7 @@ NTSTATUS STDCALL ZwMapViewOfSection(HANDLE SectionHandle,
                                      NULL);
    if (Status != STATUS_SUCCESS)
      {
+       ObDereferenceObject(Section);
        return(Status);
      }
    
@@ -346,6 +348,7 @@ NTSTATUS STDCALL ZwMapViewOfSection(HANDLE SectionHandle,
      {
        DPRINT("ZwMapViewOfSection() = %x\n",Status);
        ObDereferenceObject(Process);
+       ObDereferenceObject(Section);
        return(Status);
      }
    Result->Data.SectionData.Section = Section;
@@ -364,6 +367,7 @@ NTSTATUS STDCALL ZwMapViewOfSection(HANDLE SectionHandle,
    
    DPRINT("*BaseAddress %x\n",*BaseAddress);
    ObDereferenceObject(Process);   
+   ObDereferenceObject(Section);
    return(STATUS_SUCCESS);
 }
 
@@ -387,7 +391,9 @@ NTSTATUS ZwUnmapViewOfSection(HANDLE ProcessHandle, PVOID BaseAddress)
      {
        return(Status);
      }
-   return(MmFreeMemoryArea(Process,BaseAddress,0,TRUE));
+   Status = MmFreeMemoryArea(Process,BaseAddress,0,TRUE);
+   ObDereferenceObject(Process);
+   return(Status);
 }
 
 NTSTATUS STDCALL NtQuerySection(IN HANDLE SectionHandle,
index b51ed97..c737673 100644 (file)
@@ -50,7 +50,7 @@ NTSTATUS MmReleaseMmInfo(PEPROCESS Process)
    PLIST_ENTRY CurrentEntry;
    PMEMORY_AREA Current;
    
-   DPRINT("MmReleaseMmInfo(Process %x)\n",Process);
+   DbgPrint("MmReleaseMmInfo(Process %x)\n",Process);
    
    while (!IsListEmpty(&Process->Pcb.MemoryAreaList))
      {
@@ -95,16 +95,12 @@ BOOLEAN MmIsAddressValid(PVOID VirtualAddress)
    return(TRUE);
 }
 
-NTSTATUS
-STDCALL
-NtAllocateVirtualMemory( 
-       IN HANDLE ProcessHandle,
-       IN OUT PVOID *BaseAddress,
-       IN ULONG  ZeroBits,
-       IN OUT PULONG  RegionSize,
-       IN ULONG  AllocationType, 
-       IN ULONG  Protect
-       )
+NTSTATUS STDCALL NtAllocateVirtualMemory(IN HANDLE ProcessHandle,
+                                        IN OUT PVOID *BaseAddress,
+                                        IN ULONG  ZeroBits,
+                                        IN OUT PULONG  RegionSize,
+                                        IN ULONG  AllocationType, 
+                                        IN ULONG  Protect)
 {
    return(ZwAllocateVirtualMemory(ProcessHandle,
                                  BaseAddress,
@@ -114,16 +110,12 @@ NtAllocateVirtualMemory(
                                  Protect));
 }
 
-NTSTATUS
-STDCALL
-ZwAllocateVirtualMemory( 
-       IN HANDLE ProcessHandle,
-       IN OUT PVOID *BaseAddress,
-       IN ULONG  ZeroBits,
-       IN OUT PULONG  RegionSize,
-       IN ULONG  AllocationType, 
-       IN ULONG  Protect
-       )
+NTSTATUS STDCALL ZwAllocateVirtualMemory(IN HANDLE ProcessHandle,
+                                        IN OUT PVOID *BaseAddress,
+                                        IN ULONG  ZeroBits,
+                                        IN OUT PULONG  RegionSize,
+                                        IN ULONG  AllocationType, 
+                                        IN ULONG  Protect)
 /*
  * FUNCTION: Allocates a block of virtual memory in the process address space
  * ARGUMENTS:
@@ -317,6 +309,7 @@ NTSTATUS STDCALL ZwFreeVirtualMemory(IN HANDLE ProcessHandle,
    MemoryArea = MmOpenMemoryAreaByAddress(Process,*BaseAddress);
    if (MemoryArea == NULL)
      {
+       ObDereferenceObject(Process);
        return(STATUS_UNSUCCESSFUL);
      }
    
@@ -423,6 +416,7 @@ NTSTATUS STDCALL ZwProtectVirtualMemory(IN HANDLE ProcessHandle,
    if (MemoryArea == NULL)
      {
        DPRINT("ZwProtectVirtualMemory() = %x\n",STATUS_UNSUCCESSFUL);
+       ObDereferenceObject(Process);
        return(STATUS_UNSUCCESSFUL);
      }
 
@@ -493,24 +487,17 @@ NTSTATUS STDCALL ZwReadVirtualMemory(IN HANDLE ProcessHandle,
                                     IN ULONG  NumberOfBytesToRead,
                                     OUT PULONG NumberOfBytesRead)
 {
-   UNIMPLEMENTED;
-}
-
-#if 0
-NTSTATUS STDCALL ZwReadVirtualMemory(IN HANDLE ProcessHandle,
-                                    IN PVOID BaseAddress,
-                                    OUT PVOID Buffer,
-                                    IN ULONG  NumberOfBytesToRead,
-                                    OUT PULONG NumberOfBytesRead)
-{
-   PEPROCESS Process;
-   MEMORY_AREA* MemoryArea;
-   ULONG i;
    NTSTATUS Status;
-   PULONG CurrentEntry;
+   PMDL Mdl;
+   PVOID SystemAddress;
+   PEPROCESS Process;
+   
+   DPRINT("ZwReadVirtualMemory(ProcessHandle %x, BaseAddress %x, "
+           "Buffer %x, NumberOfBytesToRead %d)\n",ProcessHandle,BaseAddress,
+           Buffer,NumberOfBytesToRead);
    
    Status = ObReferenceObjectByHandle(ProcessHandle,
-                                     PROCESS_VM_READ,
+                                     PROCESS_VM_WRITE,
                                      NULL,
                                      UserMode,
                                      (PVOID*)(&Process),
@@ -519,32 +506,26 @@ NTSTATUS STDCALL ZwReadVirtualMemory(IN HANDLE ProcessHandle,
      {
        return(Status);
      }
-
-   MemoryArea = MmOpenMemoryAreaByAddress(Process,BaseAddress);
    
-   if (MemoryArea == NULL)
-     {
-       return(STATUS_UNSUCCESSFUL);
-     }
-   if (MemoryArea->Length > NumberOfBytesToRead)
-     {
-       NumberOfBytesToRead = MemoryArea->Length;
-     }
+   Mdl = MmCreateMdl(NULL, 
+                    Buffer,
+                    NumberOfBytesToRead);
+   MmProbeAndLockPages(Mdl,
+                      UserMode,
+                      IoWriteAccess);
    
-   *NumberOfBytesRead = NumberOfBytesToRead;
+   KeAttachProcess(Process);
    
-   for (i=0; i<(NumberOfBytesToRead/PAGESIZE); i++)
-     {
-       CurrentEntry = MmGetPageEntry(Process, 
-                                  (PVOID)((DWORD)BaseAddress + (i*PAGESIZE)));
-       RtlCopyMemory(Buffer + (i*PAGESIZE),
-                     (PVOID)physical_to_linear(PAGE_MASK(*CurrentEntry)),
-                     PAGESIZE);
-       
-     }
+   SystemAddress = MmGetSystemAddressForMdl(Mdl);
+   memcpy(SystemAddress, BaseAddress, NumberOfBytesToRead);
+   
+   KeDetachProcess();
+   
+   ObDereferenceObject(Process);
+   
+   *NumberOfBytesRead = NumberOfBytesToRead;
    return(STATUS_SUCCESS);
 }
-#endif
 
 NTSTATUS STDCALL NtUnlockVirtualMemory(HANDLE ProcessHandle,
                                       PVOID BaseAddress,
index 6175f49..a20a473 100644 (file)
@@ -3,7 +3,7 @@
  * PROJECT:            ReactOS kernel
  * FILE:               ntoskrnl/ob/handle.c
  * PURPOSE:            Managing handles
- * PROGRAMMER:         David Welch (welch@mcmail.com)
+ * PROGRAMMER:         David Welch (welch@cwcom.net)
  * REVISION HISTORY:
  *                 17/06/98: Created
  */
@@ -155,6 +155,9 @@ NTSTATUS STDCALL ZwDuplicateObject(IN HANDLE SourceProcessHandle,
        ZwClose(*SourceHandle);
      }
    
+   ObDereferenceObject(TargetProcess);
+   ObDereferenceObject(SourceProcess);
+   
    return(STATUS_SUCCESS);
 }
 
@@ -326,12 +329,15 @@ NTSTATUS ObReferenceObjectByHandle(HANDLE Handle,
    DPRINT("ObReferenceObjectByHandle(Handle %x, DesiredAccess %x, "
          "ObjectType %x, AccessMode %d, Object %x)\n",Handle,DesiredAccess,
          ObjectType,AccessMode,Object);
+
+   
    
    if (Handle == NtCurrentProcess() && 
        (ObjectType == PsProcessType || ObjectType == NULL))
      {
        BODY_TO_HEADER(PsGetCurrentProcess())->RefCount++;
        *Object = PsGetCurrentProcess();
+       DPRINT("Referencing current process %x\n", PsGetCurrentProcess());
        return(STATUS_SUCCESS);
      }
    if (Handle == NtCurrentThread() && 
@@ -350,7 +356,7 @@ NTSTATUS ObReferenceObjectByHandle(HANDLE Handle,
      }
    
    ObjectHeader = BODY_TO_HEADER(HandleRep->ObjectBody);
-   
+
    if (ObjectType != NULL && ObjectType != ObjectHeader->ObjectType)
      {
        return(STATUS_OBJECT_TYPE_MISMATCH);
@@ -362,7 +368,7 @@ NTSTATUS ObReferenceObjectByHandle(HANDLE Handle,
      }
    
    ObjectHeader->RefCount++;
-   
+
    *Object = HandleRep->ObjectBody;
    
    return(STATUS_SUCCESS);
index 56c895f..2b05283 100644 (file)
@@ -14,6 +14,7 @@
 #include <ddk/ntddk.h>
 #include <internal/ob.h>
 #include <internal/string.h>
+#include <internal/id.h>
 
 #define NDEBUG
 #include <internal/debug.h>
@@ -195,6 +196,7 @@ NTSTATUS ObReferenceObjectByPointer(PVOID ObjectBody,
      }
    
    ObjectHeader->RefCount++;
+   
    return(STATUS_SUCCESS);
 }
 
@@ -247,7 +249,8 @@ VOID ObDereferenceObject(PVOID ObjectBody)
    
    DPRINT("ObDeferenceObject(ObjectBody %x) RefCount %d\n",ObjectBody,
          Header->RefCount);
-   
+      
    Header->RefCount--;
+   
    ObPerformRetentionChecks(Header);
 }
index eceea36..e85a1a9 100644 (file)
@@ -28,7 +28,6 @@ extern ULONG PiNrThreads;
 VOID PiDeleteProcess(PVOID ObjectBody)
 {
    DPRINT("PiDeleteProcess(ObjectBody %x)\n",ObjectBody);
-   /* FIXME: This doesn't work, why? */
    (VOID)MmReleaseMmInfo((PEPROCESS)ObjectBody);
 }
 
@@ -91,9 +90,6 @@ NTSTATUS STDCALL ZwTerminateProcess(IN HANDLE ProcessHandle,
         return(Status);
    }
    
-   DPRINT("Process %x ReferenceCount %d\n",Process,
-         ObGetReferenceCount(Process));
-   
    PiTerminateProcessThreads(Process, ExitStatus);
    KeRaiseIrql(DISPATCH_LEVEL, &oldlvl);
    Process->Pcb.ProcessState = PROCESS_STATE_TERMINATED;
index e1f36e8..0a30333 100644 (file)
@@ -17,6 +17,7 @@
 #include <internal/ps.h>
 #include <string.h>
 #include <internal/string.h>
+#include <internal/id.h>
 
 #define NDEBUG
 #include <internal/debug.h>
@@ -66,6 +67,12 @@ VOID PsInitProcessManagment(VOID)
                                  PROCESS_ALL_ACCESS,
                                  NULL,
                                  PsProcessType);
+   KeInitializeDispatcherHeader(&SystemProcess->Pcb.DispatcherHeader,
+                               ID_PROCESS_OBJECT,
+                               sizeof(EPROCESS),
+                               FALSE);
+   DPRINT("SystemProcess->Pcb.Type %x\n",
+         SystemProcess->Pcb.Type);
    KProcess = &SystemProcess->Pcb;  
    
    InitializeListHead(&(KProcess->MemoryAreaList));
@@ -179,7 +186,7 @@ NTSTATUS STDCALL ZwCreateProcess(
                            ObjectAttributes,
                            PsProcessType);
    KeInitializeDispatcherHeader(&Process->Pcb.DispatcherHeader,
-                               ProcessType,
+                               ID_PROCESS_OBJECT,
                                sizeof(EPROCESS),
                                FALSE);
    KProcess = &(Process->Pcb);
@@ -244,23 +251,31 @@ NTSTATUS STDCALL ZwQueryInformationProcess(IN HANDLE ProcessHandle,
                                           IN ULONG ProcessInformationLength,
                                           OUT PULONG ReturnLength)
 {
-//   PEPROCESS Process;
+   PEPROCESS Process;
    NTSTATUS Status;
+   PPROCESS_BASIC_INFORMATION ProcessBasicInformationP;
    
-/*   Status = ObReferenceObjectByHandle(ProcessHandle,
-                                     PROCESS_QUERY_INFORMATION,
+   Status = ObReferenceObjectByHandle(ProcessHandle,
+                                     PROCESS_SET_INFORMATION,
                                      PsProcessType,
                                      UserMode,
-                                     &ProcessHandle,
+                                     (PVOID*)&Process,
                                      NULL);
    if (Status != STATUS_SUCCESS)
      {
        return(Status);
-     }*/
+     }
    
    switch (ProcessInformationClass)
      {
       case ProcessBasicInformation:
+       ProcessBasicInformationP = (PPROCESS_BASIC_INFORMATION)
+         ProcessInformation;
+       memset(ProcessBasicInformationP, 0, sizeof(PROCESS_BASIC_INFORMATION));
+       ProcessBasicInformationP->AffinityMask = Process->Pcb.Affinity;
+       Status = STATUS_SUCCESS;
+       break;
+       
       case ProcessQuotaLimits:
       case ProcessIoCounters:
       case ProcessVmCounters:
@@ -284,6 +299,7 @@ NTSTATUS STDCALL ZwQueryInformationProcess(IN HANDLE ProcessHandle,
       default:
        Status = STATUS_NOT_IMPLEMENTED;
      }
+   ObDereferenceObject(Process);
    return(Status);
 }
 
@@ -303,23 +319,31 @@ NTSTATUS STDCALL ZwSetInformationProcess(IN HANDLE ProcessHandle,
                                         IN PVOID ProcessInformation,
                                         IN ULONG ProcessInformationLength)
 {
-//   PEPROCESS Process;
+   PEPROCESS Process;
    NTSTATUS Status;
+   PPROCESS_BASIC_INFORMATION ProcessBasicInformationP;
    
-/*   Status = ObReferenceObjectByHandle(ProcessHandle,
+   Status = ObReferenceObjectByHandle(ProcessHandle,
                                      PROCESS_SET_INFORMATION,
                                      PsProcessType,
                                      UserMode,
-                                     &ProcessHandle,
+                                     (PVOID*)&Process,
                                      NULL);
    if (Status != STATUS_SUCCESS)
      {
        return(Status);
-     }*/
+     }
    
    switch (ProcessInformationClass)
      {
       case ProcessBasicInformation:
+       ProcessBasicInformationP = (PPROCESS_BASIC_INFORMATION)
+         ProcessInformation;
+       memset(ProcessBasicInformationP, 0, sizeof(PROCESS_BASIC_INFORMATION));
+       Process->Pcb.Affinity = ProcessBasicInformationP->AffinityMask;
+       Status = STATUS_SUCCESS;
+       break;
+       
       case ProcessQuotaLimits:
       case ProcessIoCounters:
       case ProcessVmCounters:
@@ -343,5 +367,6 @@ NTSTATUS STDCALL ZwSetInformationProcess(IN HANDLE ProcessHandle,
       default:
        Status = STATUS_NOT_IMPLEMENTED;
      }
+   ObDereferenceObject(Process);
    return(Status);
 }
index badfcae..a89cffe 100644 (file)
@@ -26,6 +26,7 @@
 #include <internal/string.h>
 #include <internal/hal.h>
 #include <internal/ps.h>
+#include <internal/ob.h>
 
 #define NDEBUG
 #include <internal/debug.h>
@@ -63,7 +64,7 @@ PKTHREAD KeGetCurrentThread(VOID)
 
 PETHREAD PsGetCurrentThread(VOID)
 {
-   return((PETHREAD)KeGetCurrentThread());
+   return(CurrentThread);
 }
 
 VOID PiTerminateProcessThreads(PEPROCESS Process, NTSTATUS ExitStatus)
@@ -113,7 +114,7 @@ VOID PsBeginThread(PKSTART_ROUTINE StartRoutine, PVOID StartContext)
    KeReleaseSpinLock(&ThreadListLock,PASSIVE_LEVEL);
    Ret = StartRoutine(StartContext);
    PsTerminateSystemThread(Ret);
-   for(;;);
+   KeBugCheck(0);
 }
 
 static PETHREAD PsScanThreadList(KPRIORITY Priority)
@@ -227,7 +228,7 @@ NTSTATUS PsInitializeThread(HANDLE ProcessHandle,
    Thread->Tcb.CurrentPriority=THREAD_PRIORITY_NORMAL;
    Thread->Tcb.ApcList=ExAllocatePool(NonPagedPool,sizeof(LIST_ENTRY));
    Thread->Tcb.SuspendCount = 1;
-   if (ProcessHandle!=NULL)
+   if (ProcessHandle != NULL)
      {
        Status = ObReferenceObjectByHandle(ProcessHandle,
                                           PROCESS_CREATE_THREAD,
@@ -266,7 +267,7 @@ NTSTATUS PsInitializeThread(HANDLE ProcessHandle,
    
    *ThreadPtr = Thread;
    
-   ObDereferenceObject(Thread->ThreadsProcess);   
+   ObDereferenceObject(Thread->ThreadsProcess);
    return(STATUS_SUCCESS);
 }