1  /*
2   * PROJECT:         ReactOS kernel-mode tests
3   * LICENSE:         LGPLv2+ - See COPYING.LIB in the top level directory
4   * PURPOSE:         Kernel-Mode Test Suite NPFS Create test
5   * PROGRAMMER:      Thomas Faber <thomas.faber@reactos.org>
6   */
7  
8  #include <kmt_test.h>
9  #include "npfs.h"
10  
11  static
12  VOID
13  TestCreateNamedPipe(VOID)
14  {
15      NTSTATUS Status;
16      HANDLE ServerHandle;
17      ULONG MaxInstances;
18      ULONG InQuota, OutQuota;
19      ULONG Quotas[] = { 0, 1, 2, 1024, PAGE_SIZE - 1, PAGE_SIZE, PAGE_SIZE + 1, 2 * PAGE_SIZE, 8 * PAGE_SIZE, 64 * PAGE_SIZE, 64 * PAGE_SIZE + 1, 128 * PAGE_SIZE };
20      ULONG i;
21      LARGE_INTEGER Timeout;
22  
23      /* Invalid pipe name */
24      MaxInstances = 1;
25      InQuota = 4096;
26      OutQuota = 4096;
27      ServerHandle = INVALID_HANDLE_VALUE;
28      Status = NpCreatePipe(&ServerHandle,
29                            DEVICE_NAMED_PIPE L"",
30                            BYTE_STREAM, QUEUE, BYTE_STREAM, DUPLEX,
31                            MaxInstances,
32                            InQuota,
33                            OutQuota);
34      ok_eq_hex(Status, STATUS_OBJECT_NAME_INVALID);
35      ok_eq_pointer(ServerHandle, INVALID_HANDLE_VALUE);
36      if (ServerHandle != NULL && ServerHandle != INVALID_HANDLE_VALUE)
37          ObCloseHandle(ServerHandle, KernelMode);
38  
39      ServerHandle = INVALID_HANDLE_VALUE;
40      Status = NpCreatePipe(&ServerHandle,
41                            DEVICE_NAMED_PIPE L"\\",
42                            BYTE_STREAM, QUEUE, BYTE_STREAM, DUPLEX,
43                            MaxInstances,
44                            InQuota,
45                            OutQuota);
46      ok_eq_hex(Status, STATUS_OBJECT_NAME_INVALID);
47      ok_eq_pointer(ServerHandle, INVALID_HANDLE_VALUE);
48      if (ServerHandle != NULL && ServerHandle != INVALID_HANDLE_VALUE)
49          ObCloseHandle(ServerHandle, KernelMode);
50  
51      ServerHandle = INVALID_HANDLE_VALUE;
52      Status = NpCreatePipe(&ServerHandle,
53                            DEVICE_NAMED_PIPE L"\\\\",
54                            BYTE_STREAM, QUEUE, BYTE_STREAM, DUPLEX,
55                            MaxInstances,
56                            InQuota,
57                            OutQuota);
58      ok_eq_hex(Status, STATUS_OBJECT_NAME_INVALID);
59      ok_eq_pointer(ServerHandle, INVALID_HANDLE_VALUE);
60      if (ServerHandle != NULL && ServerHandle != INVALID_HANDLE_VALUE)
61          ObCloseHandle(ServerHandle, KernelMode);
62  
63      /* Test in-quota */
64      MaxInstances = 1;
65      OutQuota = 4096;
66      for (i = 0; i < RTL_NUMBER_OF(Quotas); i++)
67      {
68          InQuota = Quotas[i];
69          ServerHandle = INVALID_HANDLE_VALUE;
70          Status = NpCreatePipe(&ServerHandle,
71                                DEVICE_NAMED_PIPE L"\\KmtestNpfsCreateTestPipe",
72                                BYTE_STREAM, QUEUE, BYTE_STREAM, DUPLEX,
73                                MaxInstances,
74                                InQuota,
75                                OutQuota);
76          ok_eq_hex(Status, STATUS_SUCCESS);
77          ok(ServerHandle != NULL && ServerHandle != INVALID_HANDLE_VALUE, "ServerHandle = %p\n", ServerHandle);
78          if (!skip(NT_SUCCESS(Status) && ServerHandle != NULL && ServerHandle != INVALID_HANDLE_VALUE, "No pipe\n"))
79          {
80              NpCheckServerPipe(ServerHandle,
81                                BYTE_STREAM, QUEUE, BYTE_STREAM, DUPLEX,
82                                MaxInstances, 1,
83                                InQuota, 0,
84                                OutQuota, OutQuota,
85                                FILE_PIPE_LISTENING_STATE);
86              ObCloseHandle(ServerHandle, KernelMode);
87              Timeout.QuadPart = -100 * 1000 * 10;
88              Status = KeDelayExecutionThread(KernelMode, FALSE, &Timeout);
89              ok_eq_hex(Status, STATUS_SUCCESS);
90          }
91      }
92  }
93  
94  static
95  VOID
96  TestCreate(VOID)
97  {
98  }
99  
100  static KSTART_ROUTINE RunTest;
101  static
102  VOID
103  NTAPI
104  RunTest(
105      IN PVOID Context)
106  {
107      UNREFERENCED_PARAMETER(Context);
108      TestCreateNamedPipe();
109      TestCreate();
110  }
111  
112  START_TEST(NpfsCreate)
113  {
114      PKTHREAD Thread;
115  
116      Thread = KmtStartThread(RunTest, NULL);
117      KmtFinishThread(Thread, NULL);
118  }
119