Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-fonts
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
Aleksandr Isakov
wine-fonts
Commits
a18a0c3f
Commit
a18a0c3f
authored
Jun 08, 2017
by
Michael Müller
Committed by
Vitaly Lipatov
Jul 30, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
programs/winedevice: Load some common drivers and fix ldr order.
parent
c9b64853
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
76 additions
and
0 deletions
+76
-0
driver.c
dlls/ntoskrnl.exe/tests/driver.c
+50
-0
device.c
programs/winedevice/device.c
+26
-0
No files found.
dlls/ntoskrnl.exe/tests/driver.c
View file @
a18a0c3f
...
...
@@ -52,6 +52,7 @@ static int kmemcmp( const void *ptr1, const void *ptr2, size_t n )
static
DRIVER_OBJECT
*
driver_obj
;
static
DEVICE_OBJECT
*
lower_device
,
*
upper_device
;
static
LDR_DATA_TABLE_ENTRY
*
ldr_module
;
static
POBJECT_TYPE
*
pExEventObjectType
,
*
pIoFileObjectType
,
*
pPsThreadType
,
*
pIoDriverObjectType
;
static
PEPROCESS
*
pPsInitialSystemProcess
;
...
...
@@ -1712,6 +1713,7 @@ static void test_resource(void)
ok
(
status
==
STATUS_SUCCESS
,
"got status %#lx
\n
"
,
status
);
}
static
void
test_lookup_thread
(
void
)
{
NTSTATUS
status
;
...
...
@@ -2290,6 +2292,52 @@ static void test_permanence(void)
ok
(
status
==
STATUS_OBJECT_NAME_NOT_FOUND
,
"got %#lx
\n
"
,
status
);
}
static
void
test_default_modules
(
void
)
{
BOOL
win32k
=
FALSE
,
dxgkrnl
=
FALSE
,
dxgmms1
=
FALSE
;
LIST_ENTRY
*
start
,
*
entry
;
ANSI_STRING
name_a
;
LDR_DATA_TABLE_ENTRY
*
mod
;
NTSTATUS
status
;
/* Try to find start of the InLoadOrderModuleList list */
for
(
start
=
ldr_module
->
InLoadOrderLinks
.
Flink
;
;
start
=
start
->
Flink
)
{
mod
=
CONTAINING_RECORD
(
start
,
LDR_DATA_TABLE_ENTRY
,
InLoadOrderLinks
);
if
(
!
MmIsAddressValid
(
&
mod
->
DllBase
)
||
!
mod
->
DllBase
)
break
;
if
(
!
MmIsAddressValid
(
&
mod
->
LoadCount
)
||
!
mod
->
LoadCount
)
break
;
if
(
!
MmIsAddressValid
(
&
mod
->
SizeOfImage
)
||
!
mod
->
SizeOfImage
)
break
;
if
(
!
MmIsAddressValid
(
&
mod
->
EntryPoint
)
||
mod
->
EntryPoint
<
mod
->
DllBase
||
(
DWORD_PTR
)
mod
->
EntryPoint
>
(
DWORD_PTR
)
mod
->
DllBase
+
mod
->
SizeOfImage
)
break
;
}
for
(
entry
=
start
->
Flink
;
entry
!=
start
;
entry
=
entry
->
Flink
)
{
mod
=
CONTAINING_RECORD
(
entry
,
LDR_DATA_TABLE_ENTRY
,
InLoadOrderLinks
);
status
=
RtlUnicodeStringToAnsiString
(
&
name_a
,
&
mod
->
BaseDllName
,
TRUE
);
ok
(
!
status
,
"RtlUnicodeStringToAnsiString failed with %08lx
\n
"
,
status
);
if
(
status
)
continue
;
if
(
entry
==
start
->
Flink
)
{
ok
(
!
strncmp
(
name_a
.
Buffer
,
"ntoskrnl.exe"
,
name_a
.
Length
),
"Expected ntoskrnl.exe, got %.*s
\n
"
,
name_a
.
Length
,
name_a
.
Buffer
);
}
if
(
!
strncmp
(
name_a
.
Buffer
,
"win32k.sys"
,
name_a
.
Length
))
win32k
=
TRUE
;
if
(
!
strncmp
(
name_a
.
Buffer
,
"dxgkrnl.sys"
,
name_a
.
Length
))
dxgkrnl
=
TRUE
;
if
(
!
strncmp
(
name_a
.
Buffer
,
"dxgmms1.sys"
,
name_a
.
Length
))
dxgmms1
=
TRUE
;
RtlFreeAnsiString
(
&
name_a
);
}
ok
(
win32k
,
"Failed to find win32k.sys
\n
"
);
ok
(
dxgkrnl
,
"Failed to find dxgkrnl.sys
\n
"
);
ok
(
dxgmms1
,
"Failed to find dxgmms1.sys
\n
"
);
}
static
NTSTATUS
main_test
(
DEVICE_OBJECT
*
device
,
IRP
*
irp
,
IO_STACK_LOCATION
*
stack
)
{
void
*
buffer
=
irp
->
AssociatedIrp
.
SystemBuffer
;
...
...
@@ -2322,6 +2370,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
test_stack_callout
();
test_lookaside_list
();
test_ob_reference
();
test_default_modules
();
test_resource
();
test_lookup_thread
();
test_IoAttachDeviceToDeviceStack
();
...
...
@@ -2801,6 +2850,7 @@ NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, PUNICODE_STRING registry)
DbgPrint
(
"loading driver
\n
"
);
driver_obj
=
driver
;
ldr_module
=
(
LDR_DATA_TABLE_ENTRY
*
)
driver
->
DriverSection
;
/* Allow unloading of the driver */
driver
->
DriverUnload
=
driver_Unload
;
...
...
programs/winedevice/device.c
View file @
a18a0c3f
...
...
@@ -122,8 +122,16 @@ static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_
static
void
WINAPI
ServiceMain
(
DWORD
argc
,
LPWSTR
*
argv
)
{
static
const
WCHAR
ntoskrnlW
[]
=
L"C:
\\
windows
\\
system32
\\
ntoskrnl.exe"
;
static
const
WCHAR
win32kW
[]
=
L"C:
\\
windows
\\
system32
\\
win32k.sys"
;
static
const
WCHAR
dxgkrnlW
[]
=
L"C:
\\
windows
\\
system32
\\
drivers
\\
dxgkrnl.sys"
;
static
const
WCHAR
dxgmms1W
[]
=
L"C:
\\
windows
\\
system32
\\
drivers
\\
dxgmms1.sys"
;
static
const
WCHAR
*
stubs
[]
=
{
win32kW
,
dxgkrnlW
,
dxgmms1W
};
WCHAR
driver_dir
[
MAX_PATH
];
const
WCHAR
*
service_group
=
(
argc
>=
2
)
?
argv
[
1
]
:
argv
[
0
];
LDR_DATA_TABLE_ENTRY
*
ldr
;
ULONG_PTR
magic
;
int
i
;
if
(
!
(
stop_event
=
CreateEventW
(
NULL
,
TRUE
,
FALSE
,
NULL
)))
return
;
...
...
@@ -136,6 +144,24 @@ static void WINAPI ServiceMain( DWORD argc, LPWSTR *argv )
wcscat
(
driver_dir
,
L"
\\
drivers"
);
AddDllDirectory
(
driver_dir
);
/* Load some default drivers (required by anticheat drivers) */
for
(
i
=
0
;
i
<
sizeof
(
stubs
)
/
sizeof
(
stubs
[
0
]);
i
++
)
{
if
(
!
LoadLibraryW
(
stubs
[
i
]
))
ERR
(
"Failed to load %s
\n
"
,
debugstr_w
(
stubs
[
i
]
)
);
}
/* ntoskrnl.exe must be the first module */
LdrLockLoaderLock
(
0
,
NULL
,
&
magic
);
if
(
!
LdrFindEntryForAddress
(
GetModuleHandleW
(
ntoskrnlW
),
&
ldr
))
{
RemoveEntryList
(
&
ldr
->
InLoadOrderLinks
);
InsertHeadList
(
&
NtCurrentTeb
()
->
Peb
->
LdrData
->
InLoadOrderModuleList
,
&
ldr
->
InLoadOrderLinks
);
RemoveEntryList
(
&
ldr
->
InMemoryOrderLinks
);
InsertHeadList
(
&
NtCurrentTeb
()
->
Peb
->
LdrData
->
InMemoryOrderModuleList
,
&
ldr
->
InMemoryOrderLinks
);
}
LdrUnlockLoaderLock
(
0
,
magic
);
TRACE
(
"starting service group %s
\n
"
,
wine_dbgstr_w
(
service_group
)
);
set_service_status
(
service_handle
,
SERVICE_RUNNING
,
SERVICE_ACCEPT_STOP
|
SERVICE_ACCEPT_SHUTDOWN
);
...
...
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