windows-nt/Source/XPSP1/NT/base/ntdll/wow64apc.c
2020-09-26 16:20:57 +08:00

138 lines
2.5 KiB
C

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
wow64apc.c
Abstract:
This module implements APC queuing to 32-bit target threads from
native 64-bit threads.
Author:
Samer Arafeh (samera) 9-Oct-2000
Revision History:
--*/
#include <ntos.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <heap.h>
#include <apcompat.h>
#include "ldrp.h"
#if defined(_WIN64)
extern PVOID Wow64ApcRoutine;
#endif
#if defined(_WIN64)
VOID
RtlpWow64Apc(
IN PVOID Argument1,
IN PVOID Argument2,
IN PVOID Argument3
)
/*++
Routine Description:
This function is called as a result of firing a usermode APC that's targeted to
a thread running inside Wow64.
Arguments:
ApcArgument1 - The 1st argument of the APC. This includes both the 32-bit APC and
the original 1st argument.
ApcArgument2 - The second argument of the APC
ApcArgument3 - The third argument of the APC
Return Value:
None
--*/
{
if (Wow64ApcRoutine)
{
(*(PPS_APC_ROUTINE) Wow64ApcRoutine) (
Argument1,
Argument2,
Argument3);
}
}
#endif
NTSTATUS
RtlQueueApcWow64Thread(
IN HANDLE ThreadHandle,
IN PPS_APC_ROUTINE ApcRoutine,
IN PVOID ApcArgument1,
IN PVOID ApcArgument2,
IN PVOID ApcArgument3
)
/*++
Routine Description:
This function is used to queue a 32-bit user-mode APC to the specified thread. The APC
will fire when the specified thread does an alertable wait.
Note: This function is only used by 64-bit components that want to queue an APC to
a thread running inside Wow64.
Arguments:
ThreadHandle - Supplies a handle to a thread object. The caller
must have THREAD_SET_CONTEXT access to the thread.
ApcRoutine - Supplies the address of the APC routine to execute when the
APC fires.
ApcArgument1 - Supplies the first PVOID passed to the APC
ApcArgument2 - Supplies the second PVOID passed to the APC
ApcArgument3 - Supplies the third PVOID passed to the APC
Return Value:
Returns an NT Status code indicating success or failure of the API
--*/
{
#if defined(_WIN64)
//
// Setup the jacket routine inside ntdll
//
ApcArgument1 = (PVOID)((ULONG_PTR) ApcArgument1 |
((ULONG_PTR) ApcRoutine << 32 ));
ApcRoutine = RtlpWow64Apc;
#endif
return NtQueueApcThread (
ThreadHandle,
ApcRoutine,
ApcArgument1,
ApcArgument2,
ApcArgument3);
}