Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
417e542e
Commit
417e542e
authored
Apr 30, 2018
by
Sebastian Lackner
Committed by
Alexandre Julliard
May 01, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntoskrnl.exe/tests: Add test driver.
Signed-off-by:
Zebediah Figura
<
z.figura12@gmail.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
470bd0c2
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
325 additions
and
0 deletions
+325
-0
configure
configure
+1
-0
configure.ac
configure.ac
+1
-0
Makefile.in
dlls/ntoskrnl.exe/tests/Makefile.in
+10
-0
driver.c
dlls/ntoskrnl.exe/tests/driver.c
+126
-0
driver.h
dlls/ntoskrnl.exe/tests/driver.h
+27
-0
driver.spec
dlls/ntoskrnl.exe/tests/driver.spec
+1
-0
ntoskrnl.c
dlls/ntoskrnl.exe/tests/ntoskrnl.c
+159
-0
No files found.
configure
View file @
417e542e
...
...
@@ -18882,6 +18882,7 @@ wine_fn_config_makefile dlls/ntdll/tests enable_tests
wine_fn_config_makefile dlls/ntdsapi enable_ntdsapi
wine_fn_config_makefile dlls/ntdsapi/tests enable_tests
wine_fn_config_makefile dlls/ntoskrnl.exe enable_ntoskrnl_exe
wine_fn_config_makefile dlls/ntoskrnl.exe/tests enable_tests
wine_fn_config_makefile dlls/ntprint enable_ntprint
wine_fn_config_makefile dlls/ntprint/tests enable_tests
wine_fn_config_makefile dlls/objsel enable_objsel
...
...
configure.ac
View file @
417e542e
...
...
@@ -3504,6 +3504,7 @@ WINE_CONFIG_MAKEFILE(dlls/ntdll/tests)
WINE_CONFIG_MAKEFILE(dlls/ntdsapi)
WINE_CONFIG_MAKEFILE(dlls/ntdsapi/tests)
WINE_CONFIG_MAKEFILE(dlls/ntoskrnl.exe)
WINE_CONFIG_MAKEFILE(dlls/ntoskrnl.exe/tests)
WINE_CONFIG_MAKEFILE(dlls/ntprint)
WINE_CONFIG_MAKEFILE(dlls/ntprint/tests)
WINE_CONFIG_MAKEFILE(dlls/objsel)
...
...
dlls/ntoskrnl.exe/tests/Makefile.in
0 → 100644
View file @
417e542e
TESTDLL
=
ntoskrnl.exe
IMPORTS
=
advapi32
driver_IMPORTS
=
winecrt0 ntoskrnl
driver_EXTRADLLFLAGS
=
-nodefaultlibs
-nostartfiles
-Wl
,--subsystem,native
SOURCES
=
\
driver.c
\
driver.spec
\
ntoskrnl.c
dlls/ntoskrnl.exe/tests/driver.c
0 → 100644
View file @
417e542e
/*
* ntoskrnl.exe testing framework
*
* Copyright 2015 Sebastian Lackner
* Copyright 2015 Michael Müller
* Copyright 2015 Christian Costa
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdarg.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
#include "windef.h"
#include "winbase.h"
#include "winternl.h"
#include "winioctl.h"
#include "ddk/wdm.h"
#include "driver.h"
static
const
WCHAR
driver_device
[]
=
{
'\\'
,
'D'
,
'e'
,
'v'
,
'i'
,
'c'
,
'e'
,
'\\'
,
'W'
,
'i'
,
'n'
,
'e'
,
'T'
,
'e'
,
's'
,
't'
,
'D'
,
'r'
,
'i'
,
'v'
,
'e'
,
'r'
,
0
};
static
const
WCHAR
driver_link
[]
=
{
'\\'
,
'D'
,
'o'
,
's'
,
'D'
,
'e'
,
'v'
,
'i'
,
'c'
,
'e'
,
's'
,
'\\'
,
'W'
,
'i'
,
'n'
,
'e'
,
'T'
,
'e'
,
's'
,
't'
,
'D'
,
'r'
,
'i'
,
'v'
,
'e'
,
'r'
,
0
};
static
NTSTATUS
test_basic_ioctl
(
IRP
*
irp
,
IO_STACK_LOCATION
*
stack
,
ULONG_PTR
*
info
)
{
ULONG
length
=
stack
->
Parameters
.
DeviceIoControl
.
OutputBufferLength
;
char
*
buffer
=
irp
->
AssociatedIrp
.
SystemBuffer
;
if
(
!
buffer
)
return
STATUS_ACCESS_VIOLATION
;
if
(
length
<
sizeof
(
teststr
))
return
STATUS_BUFFER_TOO_SMALL
;
strcpy
(
buffer
,
teststr
);
*
info
=
sizeof
(
teststr
);
return
STATUS_SUCCESS
;
}
static
NTSTATUS
WINAPI
driver_Create
(
DEVICE_OBJECT
*
device
,
IRP
*
irp
)
{
irp
->
IoStatus
.
Status
=
STATUS_SUCCESS
;
IoCompleteRequest
(
irp
,
IO_NO_INCREMENT
);
return
STATUS_SUCCESS
;
}
static
NTSTATUS
WINAPI
driver_IoControl
(
DEVICE_OBJECT
*
device
,
IRP
*
irp
)
{
IO_STACK_LOCATION
*
stack
=
IoGetCurrentIrpStackLocation
(
irp
);
NTSTATUS
status
=
STATUS_NOT_SUPPORTED
;
switch
(
stack
->
Parameters
.
DeviceIoControl
.
IoControlCode
)
{
case
IOCTL_WINETEST_BASIC_IOCTL
:
status
=
test_basic_ioctl
(
irp
,
stack
,
&
irp
->
IoStatus
.
Information
);
break
;
default:
break
;
}
irp
->
IoStatus
.
Status
=
status
;
IoCompleteRequest
(
irp
,
IO_NO_INCREMENT
);
return
status
;
}
static
NTSTATUS
WINAPI
driver_Close
(
DEVICE_OBJECT
*
device
,
IRP
*
irp
)
{
irp
->
IoStatus
.
Status
=
STATUS_SUCCESS
;
IoCompleteRequest
(
irp
,
IO_NO_INCREMENT
);
return
STATUS_SUCCESS
;
}
static
VOID
WINAPI
driver_Unload
(
DRIVER_OBJECT
*
driver
)
{
UNICODE_STRING
linkW
;
DbgPrint
(
"unloading driver
\n
"
);
RtlInitUnicodeString
(
&
linkW
,
driver_link
);
IoDeleteSymbolicLink
(
&
linkW
);
IoDeleteDevice
(
driver
->
DeviceObject
);
}
NTSTATUS
WINAPI
DriverEntry
(
DRIVER_OBJECT
*
driver
,
PUNICODE_STRING
registry
)
{
UNICODE_STRING
nameW
,
linkW
;
DEVICE_OBJECT
*
device
;
NTSTATUS
status
;
DbgPrint
(
"loading driver
\n
"
);
/* Allow unloading of the driver */
driver
->
DriverUnload
=
driver_Unload
;
/* Set driver functions */
driver
->
MajorFunction
[
IRP_MJ_CREATE
]
=
driver_Create
;
driver
->
MajorFunction
[
IRP_MJ_DEVICE_CONTROL
]
=
driver_IoControl
;
driver
->
MajorFunction
[
IRP_MJ_CLOSE
]
=
driver_Close
;
RtlInitUnicodeString
(
&
nameW
,
driver_device
);
RtlInitUnicodeString
(
&
linkW
,
driver_link
);
if
(
!
(
status
=
IoCreateDevice
(
driver
,
0
,
&
nameW
,
FILE_DEVICE_UNKNOWN
,
FILE_DEVICE_SECURE_OPEN
,
FALSE
,
&
device
)))
status
=
IoCreateSymbolicLink
(
&
linkW
,
&
nameW
);
return
status
;
}
dlls/ntoskrnl.exe/tests/driver.h
0 → 100644
View file @
417e542e
/*
* ntoskrnl.exe testing framework
*
* Copyright 2015 Sebastian Lackner
* Copyright 2015 Michael Müller
* Copyright 2015 Christian Costa
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
/* All custom IOCTLs need to have a function value >= 0x800. */
#define IOCTL_WINETEST_BASIC_IOCTL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
static
const
char
teststr
[]
=
"Wine is not an emulator"
;
dlls/ntoskrnl.exe/tests/driver.spec
0 → 100644
View file @
417e542e
# nothing here yet
dlls/ntoskrnl.exe/tests/ntoskrnl.c
0 → 100644
View file @
417e542e
/*
* ntoskrnl.exe testing framework
*
* Copyright 2015 Sebastian Lackner
* Copyright 2015 Michael Müller
* Copyright 2015 Christian Costa
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windows.h"
#include "winsvc.h"
#include "winioctl.h"
#include "wine/test.h"
#include "driver.h"
static
const
char
driver_name
[]
=
"WineTestDriver"
;
static
const
char
device_path
[]
=
"
\\\\
.
\\
WineTestDriver"
;
static
HANDLE
device
;
static
void
load_resource
(
const
char
*
name
,
char
*
filename
)
{
static
char
path
[
MAX_PATH
];
DWORD
written
;
HANDLE
file
;
HRSRC
res
;
void
*
ptr
;
GetTempPathA
(
sizeof
(
path
),
path
);
GetTempFileNameA
(
path
,
name
,
0
,
filename
);
file
=
CreateFileA
(
filename
,
GENERIC_READ
|
GENERIC_WRITE
,
0
,
NULL
,
CREATE_ALWAYS
,
0
,
0
);
ok
(
file
!=
INVALID_HANDLE_VALUE
,
"file creation failed, at %s, error %d
\n
"
,
filename
,
GetLastError
());
res
=
FindResourceA
(
NULL
,
name
,
"TESTDLL"
);
ok
(
res
!=
0
,
"couldn't find resource
\n
"
);
ptr
=
LockResource
(
LoadResource
(
GetModuleHandleA
(
NULL
),
res
));
WriteFile
(
file
,
ptr
,
SizeofResource
(
GetModuleHandleA
(
NULL
),
res
),
&
written
,
NULL
);
ok
(
written
==
SizeofResource
(
GetModuleHandleA
(
NULL
),
res
),
"couldn't write resource
\n
"
);
CloseHandle
(
file
);
}
static
void
unload_driver
(
SC_HANDLE
service
)
{
SERVICE_STATUS
status
;
CloseHandle
(
device
);
ControlService
(
service
,
SERVICE_CONTROL_STOP
,
&
status
);
while
(
status
.
dwCurrentState
==
SERVICE_STOP_PENDING
)
{
Sleep
(
100
);
ok
(
QueryServiceStatus
(
service
,
&
status
),
"QueryServiceStatus failed: %u
\n
"
,
GetLastError
());
}
ok
(
status
.
dwCurrentState
==
SERVICE_STOPPED
,
"expected SERVICE_STOPPED, got %d
\n
"
,
status
.
dwCurrentState
);
DeleteService
(
service
);
CloseServiceHandle
(
service
);
}
static
SC_HANDLE
load_driver
(
char
*
filename
)
{
SC_HANDLE
manager
,
service
;
SERVICE_STATUS
status
;
BOOL
ret
;
manager
=
OpenSCManagerA
(
NULL
,
NULL
,
SC_MANAGER_ALL_ACCESS
);
if
(
!
manager
&&
GetLastError
()
==
ERROR_ACCESS_DENIED
)
{
skip
(
"Failed to open SC manager, not enough permissions
\n
"
);
return
FALSE
;
}
ok
(
!!
manager
,
"OpenSCManager failed
\n
"
);
/* before we start with the actual tests, make sure to terminate
* any old wine test drivers. */
service
=
OpenServiceA
(
manager
,
driver_name
,
SERVICE_ALL_ACCESS
);
if
(
service
)
unload_driver
(
service
);
load_resource
(
"driver.dll"
,
filename
);
trace
(
"Trying to load driver %s
\n
"
,
filename
);
service
=
CreateServiceA
(
manager
,
driver_name
,
driver_name
,
SERVICE_ALL_ACCESS
,
SERVICE_KERNEL_DRIVER
,
SERVICE_DEMAND_START
,
SERVICE_ERROR_NORMAL
,
filename
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
);
ok
(
!!
service
,
"CreateService failed: %u
\n
"
,
GetLastError
());
CloseServiceHandle
(
manager
);
SetLastError
(
0xdeadbeef
);
ret
=
StartServiceA
(
service
,
0
,
NULL
);
if
(
!
ret
&&
GetLastError
()
==
ERROR_DRIVER_BLOCKED
)
{
/* If Secure Boot is enabled or the machine is 64-bit, it will reject an unsigned driver. */
skip
(
"Failed to start service; probably your machine doesn't accept unsigned drivers.
\n
"
);
DeleteService
(
service
);
CloseServiceHandle
(
service
);
DeleteFileA
(
filename
);
return
NULL
;
}
ok
(
ret
,
"StartService failed: %u
\n
"
,
GetLastError
());
/* wait for the service to start up properly */
ok
(
QueryServiceStatus
(
service
,
&
status
),
"QueryServiceStatus failed: %u
\n
"
,
GetLastError
());
while
(
status
.
dwCurrentState
==
SERVICE_START_PENDING
)
{
Sleep
(
100
);
ok
(
QueryServiceStatus
(
service
,
&
status
),
"QueryServiceStatus failed: %u
\n
"
,
GetLastError
());
}
ok
(
status
.
dwCurrentState
==
SERVICE_RUNNING
,
"expected SERVICE_RUNNING, got %d
\n
"
,
status
.
dwCurrentState
);
device
=
CreateFileA
(
device_path
,
0
,
0
,
NULL
,
OPEN_EXISTING
,
0
,
NULL
);
ok
(
device
!=
INVALID_HANDLE_VALUE
,
"failed to open device: %u
\n
"
,
GetLastError
());
return
service
;
}
static
void
test_basic_ioctl
(
void
)
{
DWORD
written
;
char
buf
[
32
];
BOOL
res
;
res
=
DeviceIoControl
(
device
,
IOCTL_WINETEST_BASIC_IOCTL
,
NULL
,
0
,
buf
,
sizeof
(
buf
),
&
written
,
NULL
);
ok
(
res
,
"DeviceIoControl failed: %u
\n
"
,
GetLastError
());
ok
(
written
==
sizeof
(
teststr
),
"got size %d
\n
"
,
written
);
ok
(
!
strcmp
(
buf
,
teststr
),
"got '%s'
\n
"
,
buf
);
}
START_TEST
(
ntoskrnl
)
{
char
filename
[
MAX_PATH
];
SC_HANDLE
service
;
if
(
!
(
service
=
load_driver
(
filename
)))
return
;
test_basic_ioctl
();
unload_driver
(
service
);
ok
(
DeleteFileA
(
filename
),
"DeleteFile failed: %u
\n
"
,
GetLastError
());
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment