Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
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-winehq
Commits
2de67b84
Commit
2de67b84
authored
Oct 08, 2003
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Duplicate parts of the relay debugging init code into kernel to avoid
referencing ntdll internal symbols.
parent
0de2fde5
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
186 additions
and
41 deletions
+186
-41
relay16.c
dlls/kernel/relay16.c
+175
-33
snoop16.c
dlls/kernel/snoop16.c
+2
-2
wowthunk.c
dlls/kernel/wowthunk.c
+4
-0
relay.c
dlls/ntdll/relay.c
+5
-6
No files found.
dlls/kernel/relay16.c
View file @
2de67b84
...
...
@@ -40,52 +40,121 @@
WINE_DEFAULT_DEBUG_CHANNEL
(
relay
);
/*
* Stubs for the CallTo16/CallFrom16 routines on non-Intel architectures
* (these will never be called but need to be present to satisfy the linker ...)
*/
#ifndef __i386__
/***********************************************************************
* __wine_call_from_16_word (KERNEL32.@)
*/
WORD
__wine_call_from_16_word
(
)
#ifdef __i386__
static
const
WCHAR
**
debug_relay_excludelist
;
static
const
WCHAR
**
debug_relay_includelist
;
static
const
WCHAR
**
debug_snoop_excludelist
;
static
const
WCHAR
**
debug_snoop_includelist
;
/* compare an ASCII and a Unicode string without depending on the current codepage
*/
inline
static
int
strncmpiAW
(
const
char
*
strA
,
const
WCHAR
*
strW
,
int
n
)
{
assert
(
FALSE
);
int
ret
=
0
;
for
(
;
n
>
0
;
n
--
,
strA
++
,
strW
++
)
if
((
ret
=
toupperW
((
unsigned
char
)
*
strA
)
-
toupperW
(
*
strW
))
||
!*
strA
)
break
;
return
ret
;
}
/***********************************************************************
* __wine_call_from_16_long (KERNEL32.@)
* build_list
*
* Build a function list from a ';'-separated string.
*/
LONG
__wine_call_from_16_long
(
)
static
const
WCHAR
**
build_list
(
const
WCHAR
*
buffer
)
{
assert
(
FALSE
);
int
count
=
1
;
const
WCHAR
*
p
=
buffer
;
const
WCHAR
**
ret
;
while
((
p
=
strchrW
(
p
,
';'
)))
{
count
++
;
p
++
;
}
/* allocate count+1 pointers, plus the space for a copy of the string */
if
((
ret
=
RtlAllocateHeap
(
GetProcessHeap
(),
0
,
(
count
+
1
)
*
sizeof
(
WCHAR
*
)
+
(
strlenW
(
buffer
)
+
1
)
*
sizeof
(
WCHAR
)
)))
{
WCHAR
*
str
=
(
WCHAR
*
)(
ret
+
count
+
1
);
WCHAR
*
p
=
str
;
strcpyW
(
str
,
buffer
);
count
=
0
;
for
(;;)
{
ret
[
count
++
]
=
p
;
if
(
!
(
p
=
strchrW
(
p
,
';'
)))
break
;
*
p
++
=
0
;
}
ret
[
count
++
]
=
NULL
;
}
return
ret
;
}
/***********************************************************************
* __wine_call_from_16_regs (KERNEL32.@)
* RELAY16_InitDebugLists
*
* Build the relay include/exclude function lists.
*/
void
__wine_call_from_16_regs
(
)
void
RELAY16_InitDebugLists
(
void
)
{
assert
(
FALSE
);
}
DWORD
WINAPI
CALL32_CBClient
(
FARPROC
proc
,
LPWORD
args
,
DWORD
*
esi
)
{
assert
(
FALSE
);
}
OBJECT_ATTRIBUTES
attr
;
UNICODE_STRING
name
;
char
buffer
[
1024
];
HKEY
hkey
;
DWORD
count
;
WCHAR
*
str
;
static
const
WCHAR
configW
[]
=
{
'M'
,
'a'
,
'c'
,
'h'
,
'i'
,
'n'
,
'e'
,
'\\'
,
'S'
,
'o'
,
'f'
,
't'
,
'w'
,
'a'
,
'r'
,
'e'
,
'\\'
,
'W'
,
'i'
,
'n'
,
'e'
,
'\\'
,
'W'
,
'i'
,
'n'
,
'e'
,
'\\'
,
'C'
,
'o'
,
'n'
,
'f'
,
'i'
,
'g'
,
'\\'
,
'D'
,
'e'
,
'b'
,
'u'
,
'g'
,
0
};
static
const
WCHAR
RelayIncludeW
[]
=
{
'R'
,
'e'
,
'l'
,
'a'
,
'y'
,
'I'
,
'n'
,
'c'
,
'l'
,
'u'
,
'd'
,
'e'
,
0
};
static
const
WCHAR
RelayExcludeW
[]
=
{
'R'
,
'e'
,
'l'
,
'a'
,
'y'
,
'E'
,
'x'
,
'c'
,
'l'
,
'u'
,
'd'
,
'e'
,
0
};
static
const
WCHAR
SnoopIncludeW
[]
=
{
'S'
,
'n'
,
'o'
,
'o'
,
'p'
,
'I'
,
'n'
,
'c'
,
'l'
,
'u'
,
'd'
,
'e'
,
0
};
static
const
WCHAR
SnoopExcludeW
[]
=
{
'S'
,
'n'
,
'o'
,
'o'
,
'p'
,
'E'
,
'x'
,
'c'
,
'l'
,
'u'
,
'd'
,
'e'
,
0
};
attr
.
Length
=
sizeof
(
attr
);
attr
.
RootDirectory
=
0
;
attr
.
ObjectName
=
&
name
;
attr
.
Attributes
=
0
;
attr
.
SecurityDescriptor
=
NULL
;
attr
.
SecurityQualityOfService
=
NULL
;
RtlInitUnicodeString
(
&
name
,
configW
);
if
(
NtOpenKey
(
&
hkey
,
KEY_ALL_ACCESS
,
&
attr
))
return
;
str
=
(
WCHAR
*
)((
KEY_VALUE_PARTIAL_INFORMATION
*
)
buffer
)
->
Data
;
RtlInitUnicodeString
(
&
name
,
RelayIncludeW
);
if
(
!
NtQueryValueKey
(
hkey
,
&
name
,
KeyValuePartialInformation
,
buffer
,
sizeof
(
buffer
),
&
count
))
{
debug_relay_includelist
=
build_list
(
str
);
}
DWORD
WINAPI
CALL32_CBClientEx
(
FARPROC
proc
,
LPWORD
args
,
DWORD
*
esi
,
INT
*
nArgs
)
{
assert
(
FALSE
);
}
#endif
RtlInitUnicodeString
(
&
name
,
RelayExcludeW
);
if
(
!
NtQueryValueKey
(
hkey
,
&
name
,
KeyValuePartialInformation
,
buffer
,
sizeof
(
buffer
),
&
count
))
{
debug_relay_excludelist
=
build_list
(
str
);
}
RtlInitUnicodeString
(
&
name
,
SnoopIncludeW
);
if
(
!
NtQueryValueKey
(
hkey
,
&
name
,
KeyValuePartialInformation
,
buffer
,
sizeof
(
buffer
),
&
count
))
{
debug_snoop_includelist
=
build_list
(
str
);
}
/* compare an ASCII and a Unicode string without depending on the current codepage */
inline
static
int
strncmpiAW
(
const
char
*
strA
,
const
WCHAR
*
strW
,
int
n
)
{
int
ret
=
0
;
for
(
;
n
>
0
;
n
--
,
strA
++
,
strW
++
)
if
((
ret
=
toupperW
((
unsigned
char
)
*
strA
)
-
toupperW
(
*
strW
))
||
!*
strA
)
break
;
return
ret
;
RtlInitUnicodeString
(
&
name
,
SnoopExcludeW
);
if
(
!
NtQueryValueKey
(
hkey
,
&
name
,
KeyValuePartialInformation
,
buffer
,
sizeof
(
buffer
),
&
count
))
{
debug_snoop_excludelist
=
build_list
(
str
);
}
NtClose
(
hkey
);
}
/***********************************************************************
* RELAY_ShowDebugmsgRelay
*
...
...
@@ -94,9 +163,6 @@ inline static int strncmpiAW( const char *strA, const WCHAR *strW, int n )
*/
static
int
RELAY_ShowDebugmsgRelay
(
const
char
*
func
)
{
/* from dlls/ntdll/relay.c (FIXME) */
extern
const
WCHAR
**
debug_relay_excludelist
,
**
debug_relay_includelist
;
if
(
debug_relay_excludelist
||
debug_relay_includelist
)
{
const
char
*
term
=
strchr
(
func
,
':'
);
const
WCHAR
**
listitem
;
...
...
@@ -129,6 +195,43 @@ static int RELAY_ShowDebugmsgRelay(const char *func)
/***********************************************************************
* SNOOP16_ShowDebugmsgSnoop
*
* Simple function to decide if a particular debugging message is
* wanted.
*/
int
SNOOP16_ShowDebugmsgSnoop
(
const
char
*
dll
,
int
ord
,
const
char
*
fname
)
{
if
(
debug_snoop_excludelist
||
debug_snoop_includelist
)
{
const
WCHAR
**
listitem
;
char
buf
[
80
];
int
len
,
len2
,
itemlen
,
show
;
if
(
debug_snoop_excludelist
)
{
show
=
1
;
listitem
=
debug_snoop_excludelist
;
}
else
{
show
=
0
;
listitem
=
debug_snoop_includelist
;
}
len
=
strlen
(
dll
);
assert
(
len
<
64
);
sprintf
(
buf
,
"%s.%d"
,
dll
,
ord
);
len2
=
strlen
(
buf
);
for
(;
*
listitem
;
listitem
++
)
{
itemlen
=
strlenW
(
*
listitem
);
if
(
itemlen
==
len
&&
!
strncmpiAW
(
buf
,
*
listitem
,
len
))
return
!
show
;
if
(
itemlen
==
len2
&&
!
strncmpiAW
(
buf
,
*
listitem
,
len2
))
return
!
show
;
if
(
fname
&&
!
strncmpiAW
(
fname
,
*
listitem
,
itemlen
)
&&
!
fname
[
itemlen
])
return
!
show
;
}
return
show
;
}
return
1
;
}
/***********************************************************************
* get_entry_point
*
* Return the ordinal, name, and type info corresponding to a CS:IP address.
...
...
@@ -335,3 +438,42 @@ void RELAY_DebugCallFrom16Ret( CONTEXT86 *context, int ret_val )
}
SYSLEVEL_CheckNotLevel
(
2
);
}
#else
/* __i386__ */
/*
* Stubs for the CallTo16/CallFrom16 routines on non-Intel architectures
* (these will never be called but need to be present to satisfy the linker ...)
*/
/***********************************************************************
* __wine_call_from_16_word (KERNEL32.@)
*/
WORD
__wine_call_from_16_word
()
{
assert
(
FALSE
);
}
/***********************************************************************
* __wine_call_from_16_long (KERNEL32.@)
*/
LONG
__wine_call_from_16_long
()
{
assert
(
FALSE
);
}
/***********************************************************************
* __wine_call_from_16_regs (KERNEL32.@)
*/
void
__wine_call_from_16_regs
()
{
assert
(
FALSE
);
}
DWORD
WINAPI
CALL32_CBClient
(
FARPROC
proc
,
LPWORD
args
,
DWORD
*
esi
)
{
assert
(
FALSE
);
}
DWORD
WINAPI
CALL32_CBClientEx
(
FARPROC
proc
,
LPWORD
args
,
DWORD
*
esi
,
INT
*
nArgs
)
{
assert
(
FALSE
);
}
#endif
/* __i386__ */
dlls/kernel/snoop16.c
View file @
2de67b84
...
...
@@ -43,7 +43,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(snoop);
#include "pshpack1.h"
extern
int
SNOOP
_ShowDebugmsgSnoop
(
const
char
*
dll
,
int
ord
,
const
char
*
fname
);
/* FIXME */
extern
int
SNOOP
16_ShowDebugmsgSnoop
(
const
char
*
dll
,
int
ord
,
const
char
*
fname
);
void
WINAPI
SNOOP16_Entry
(
FARPROC
proc
,
LPBYTE
args
,
CONTEXT86
*
context
);
void
WINAPI
SNOOP16_Return
(
FARPROC
proc
,
LPBYTE
args
,
CONTEXT86
*
context
);
...
...
@@ -218,7 +218,7 @@ SNOOP16_GetProcAddress16(HMODULE16 hmod,DWORD ordinal,FARPROC16 origfun) {
else
fun
->
name
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
1
);
/* empty string */
if
(
!
SNOOP_ShowDebugmsgSnoop
(
dll
->
name
,
ordinal
,
fun
->
name
))
if
(
!
SNOOP
16
_ShowDebugmsgSnoop
(
dll
->
name
,
ordinal
,
fun
->
name
))
return
origfun
;
/* more magic. do not try to snoop thunk data entries (MMSYSTEM) */
...
...
dlls/kernel/wowthunk.c
View file @
2de67b84
...
...
@@ -88,6 +88,8 @@ extern SEGPTR CALL32_CBClientEx_RetAddr;
extern
BYTE
Call16_Start
;
extern
BYTE
Call16_End
;
extern
void
RELAY16_InitDebugLists
(
void
);
static
SEGPTR
call16_ret_addr
;
/* segptr to CallTo16_Ret routine */
/***********************************************************************
...
...
@@ -109,6 +111,8 @@ BOOL WOWTHUNK_Init(void)
MAKESEGPTR
(
codesel
,
(
char
*
)
CALL32_CBClient_Ret
-
(
char
*
)
Call16_Ret_Start
);
CALL32_CBClientEx_RetAddr
=
MAKESEGPTR
(
codesel
,
(
char
*
)
CALL32_CBClientEx_Ret
-
(
char
*
)
Call16_Ret_Start
);
if
(
TRACE_ON
(
relay
))
RELAY16_InitDebugLists
();
return
TRUE
;
}
...
...
dlls/ntdll/relay.c
View file @
2de67b84
...
...
@@ -41,11 +41,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(relay);
WINE_DECLARE_DEBUG_CHANNEL
(
snoop
);
WINE_DECLARE_DEBUG_CHANNEL
(
seh
);
const
WCHAR
**
debug_relay_excludelist
=
NULL
;
const
WCHAR
**
debug_relay_includelist
=
NULL
;
const
WCHAR
**
debug_snoop_excludelist
=
NULL
;
const
WCHAR
**
debug_snoop_includelist
=
NULL
;
static
const
WCHAR
**
debug_relay_excludelist
;
static
const
WCHAR
**
debug_relay_includelist
;
static
const
WCHAR
**
debug_snoop_excludelist
;
static
const
WCHAR
**
debug_snoop_includelist
;
static
const
WCHAR
**
debug_from_relay_excludelist
;
static
const
WCHAR
**
debug_from_relay_includelist
;
...
...
@@ -764,7 +763,7 @@ void RELAY_SetupDLL( HMODULE module )
* Simple function to decide if a particular debugging message is
* wanted.
*/
int
SNOOP_ShowDebugmsgSnoop
(
const
char
*
dll
,
int
ord
,
const
char
*
fname
)
static
int
SNOOP_ShowDebugmsgSnoop
(
const
char
*
dll
,
int
ord
,
const
char
*
fname
)
{
if
(
debug_snoop_excludelist
||
debug_snoop_includelist
)
{
const
WCHAR
**
listitem
;
...
...
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