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
7bd58ba1
Commit
7bd58ba1
authored
Jun 17, 2022
by
Huw Davies
Committed by
Alexandre Julliard
Jun 21, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
nsiproxy: Use an unsigned integer for the ICMP handles.
Signed-off-by:
Huw Davies
<
huw@codeweavers.com
>
parent
1c83efac
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
41 additions
and
27 deletions
+41
-27
device.c
dlls/nsiproxy.sys/device.c
+11
-8
icmp_echo.c
dlls/nsiproxy.sys/icmp_echo.c
+15
-17
nsiproxy_private.h
dlls/nsiproxy.sys/nsiproxy_private.h
+15
-2
No files found.
dlls/nsiproxy.sys/device.c
View file @
7bd58ba1
...
...
@@ -180,19 +180,20 @@ static NTSTATUS nsiproxy_get_parameter( IRP *irp )
return
status
;
}
static
inline
HANDLE
irp_get_icmp_handle
(
IRP
*
irp
)
static
inline
icmp_handle
irp_get_icmp_handle
(
IRP
*
irp
)
{
return
irp
->
Tail
.
Overlay
.
DriverContext
[
0
]
;
return
PtrToUlong
(
irp
->
Tail
.
Overlay
.
DriverContext
[
0
]
)
;
}
static
inline
HANDLE
irp_set_icmp_handle
(
IRP
*
irp
,
HANDLE
handle
)
static
inline
icmp_handle
irp_set_icmp_handle
(
IRP
*
irp
,
icmp_handle
handle
)
{
return
InterlockedExchangePointer
(
irp
->
Tail
.
Overlay
.
DriverContext
,
handle
);
return
PtrToUlong
(
InterlockedExchangePointer
(
irp
->
Tail
.
Overlay
.
DriverContext
,
ULongToPtr
(
handle
)
)
);
}
static
void
WINAPI
icmp_echo_cancel
(
DEVICE_OBJECT
*
device
,
IRP
*
irp
)
{
HANDLE
handle
;
struct
icmp_cancel_listen_params
params
;
TRACE
(
"device %p, irp %p.
\n
"
,
device
,
irp
);
...
...
@@ -205,8 +206,8 @@ static void WINAPI icmp_echo_cancel( DEVICE_OBJECT *device, IRP *irp )
cancel it, or the irp has already finished. If the handle
does exist then notify the listen thread. In all cases the irp
will be completed elsewhere. */
handle
=
irp_get_icmp_handle
(
irp
);
if
(
handle
)
nsiproxy_call
(
icmp_cancel_listen
,
handle
);
params
.
handle
=
irp_get_icmp_handle
(
irp
);
if
(
params
.
handle
)
nsiproxy_call
(
icmp_cancel_listen
,
&
params
);
LeaveCriticalSection
(
&
nsiproxy_cs
);
}
...
...
@@ -328,6 +329,7 @@ static DWORD WINAPI listen_thread_proc( void *arg )
IRP
*
irp
=
arg
;
IO_STACK_LOCATION
*
irpsp
=
IoGetCurrentIrpStackLocation
(
irp
);
struct
nsiproxy_icmp_echo
*
in
=
irp
->
AssociatedIrp
.
SystemBuffer
;
struct
icmp_close_params
close_params
;
struct
icmp_listen_params
params
;
NTSTATUS
status
;
...
...
@@ -345,7 +347,8 @@ static DWORD WINAPI listen_thread_proc( void *arg )
EnterCriticalSection
(
&
nsiproxy_cs
);
nsiproxy_call
(
icmp_close
,
irp_set_icmp_handle
(
irp
,
NULL
)
);
close_params
.
handle
=
irp_set_icmp_handle
(
irp
,
0
);
nsiproxy_call
(
icmp_close
,
&
close_params
);
irp
->
IoStatus
.
Status
=
status
;
if
(
status
==
STATUS_SUCCESS
)
...
...
dlls/nsiproxy.sys/icmp_echo.c
View file @
7bd58ba1
...
...
@@ -120,10 +120,10 @@ static struct icmp_data *handle_table[MAX_HANDLES];
static
pthread_mutex_t
handle_lock
=
PTHREAD_MUTEX_INITIALIZER
;
static
struct
icmp_data
**
next_free
,
**
next_unused
=
handle_table
;
static
HANDLE
handle_alloc
(
struct
icmp_data
*
data
)
static
icmp_handle
handle_alloc
(
struct
icmp_data
*
data
)
{
struct
icmp_data
**
entry
;
HANDLE
h
;
icmp_handle
h
;
pthread_mutex_lock
(
&
handle_lock
);
entry
=
next_free
;
...
...
@@ -136,25 +136,23 @@ static HANDLE handle_alloc( struct icmp_data *data )
return
0
;
}
*
entry
=
data
;
h
=
LongToHandle
(
entry
-
handle_table
+
1
)
;
h
=
entry
-
handle_table
+
1
;
pthread_mutex_unlock
(
&
handle_lock
);
TRACE
(
"returning handle %
p
\n
"
,
h
);
TRACE
(
"returning handle %
x
\n
"
,
h
);
return
h
;
}
static
struct
icmp_data
**
handle_entry
(
HANDLE
h
)
static
struct
icmp_data
**
handle_entry
(
icmp_handle
h
)
{
unsigned
int
idx
=
HandleToLong
(
h
);
if
(
!
idx
||
idx
>
MAX_HANDLES
)
if
(
!
h
||
h
>
MAX_HANDLES
)
{
ERR
(
"Invalid icmp handle
\n
"
);
return
NULL
;
}
return
handle_table
+
idx
-
1
;
return
handle_table
+
h
-
1
;
}
static
struct
icmp_data
*
handle_data
(
HANDLE
h
)
static
struct
icmp_data
*
handle_data
(
icmp_handle
h
)
{
struct
icmp_data
**
entry
=
handle_entry
(
h
);
...
...
@@ -162,11 +160,11 @@ static struct icmp_data *handle_data( HANDLE h )
return
*
entry
;
}
static
void
handle_free
(
HANDLE
h
)
static
void
handle_free
(
icmp_handle
h
)
{
struct
icmp_data
**
entry
;
TRACE
(
"%
p
\n
"
,
h
);
TRACE
(
"%
x
\n
"
,
h
);
pthread_mutex_lock
(
&
handle_lock
);
entry
=
handle_entry
(
h
);
if
(
entry
)
...
...
@@ -778,8 +776,8 @@ NTSTATUS icmp_listen( void *args )
NTSTATUS
icmp_cancel_listen
(
void
*
args
)
{
HANDLE
handle
=
args
;
struct
icmp_data
*
data
=
handle_data
(
handle
);
struct
icmp_cancel_listen_params
*
params
=
args
;
struct
icmp_data
*
data
=
handle_data
(
params
->
handle
);
if
(
!
data
)
return
STATUS_INVALID_PARAMETER
;
write
(
data
->
cancel_pipe
[
1
],
"x"
,
1
);
...
...
@@ -788,11 +786,11 @@ NTSTATUS icmp_cancel_listen( void *args )
NTSTATUS
icmp_close
(
void
*
args
)
{
HANDLE
handle
=
args
;
struct
icmp_data
*
data
=
handle_data
(
handle
);
struct
icmp_close_params
*
params
=
args
;
struct
icmp_data
*
data
=
handle_data
(
params
->
handle
);
if
(
!
data
)
return
STATUS_INVALID_PARAMETER
;
icmp_data_free
(
data
);
handle_free
(
handle
);
handle_free
(
params
->
handle
);
return
STATUS_SUCCESS
;
}
dlls/nsiproxy.sys/nsiproxy_private.h
View file @
7bd58ba1
...
...
@@ -17,9 +17,22 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
typedef
UINT
icmp_handle
;
struct
icmp_cancel_listen_params
{
icmp_handle
handle
;
};
struct
icmp_close_params
{
icmp_handle
handle
;
};
struct
icmp_listen_params
{
HANDLE
handle
;
icmp_handle
handle
;
void
*
reply
;
ULONGLONG
user_reply_ptr
;
unsigned
int
bits
,
reply_len
;
...
...
@@ -32,7 +45,7 @@ struct icmp_send_echo_params
void
*
request
,
*
reply
;
UINT
request_size
,
reply_len
;
BYTE
bits
,
ttl
,
tos
;
HANDLE
handle
;
icmp_handle
handle
;
};
/* output for IOCTL_NSIPROXY_WINE_ICMP_ECHO - cf. ICMP_ECHO_REPLY */
...
...
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