mirror of
https://gitlab.winehq.org/wine/wine.git
synced 2024-11-19 17:06:04 -07:00
ntdll: Implement NtSetIoCompletionEx().
This commit is contained in:
parent
54b9f68b8e
commit
b240f8ea93
Notes:
Alexandre Julliard
2024-11-14 23:13:33 +01:00
Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/wine/merge_requests/6774
15 changed files with 151 additions and 82 deletions
|
@ -400,6 +400,7 @@
|
|||
@ stdcall -syscall NtSetInformationVirtualMemory(long long ptr ptr ptr long)
|
||||
@ stdcall -syscall NtSetIntervalProfile(long long)
|
||||
@ stdcall -syscall NtSetIoCompletion(ptr long long long long)
|
||||
@ stdcall -syscall NtSetIoCompletionEx(ptr ptr long long long long)
|
||||
@ stdcall -syscall NtSetLdtEntries(long int64 long int64)
|
||||
# @ stub NtSetLowEventPair
|
||||
# @ stub NtSetLowWaitHighEventPair
|
||||
|
@ -1460,6 +1461,7 @@
|
|||
@ stdcall -private -syscall ZwSetInformationVirtualMemory(long long ptr ptr ptr long) NtSetInformationVirtualMemory
|
||||
@ stdcall -private -syscall ZwSetIntervalProfile(long long) NtSetIntervalProfile
|
||||
@ stdcall -private -syscall ZwSetIoCompletion(ptr long long long long) NtSetIoCompletion
|
||||
@ stdcall -private -syscall ZwSetIoCompletionEx(ptr ptr long long long long) NtSetIoCompletionEx
|
||||
@ stdcall -private -syscall ZwSetLdtEntries(long int64 long int64) NtSetLdtEntries
|
||||
# @ stub ZwSetLowEventPair
|
||||
# @ stub ZwSetLowWaitHighEventPair
|
||||
|
|
|
@ -203,48 +203,49 @@
|
|||
SYSCALL_ENTRY( 0x00c7, NtSetInformationVirtualMemory, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00c8, NtSetIntervalProfile, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00c9, NtSetIoCompletion, 20 ) \
|
||||
SYSCALL_ENTRY( 0x00ca, NtSetLdtEntries, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00cb, NtSetSecurityObject, 12 ) \
|
||||
SYSCALL_ENTRY( 0x00cc, NtSetSystemInformation, 12 ) \
|
||||
SYSCALL_ENTRY( 0x00cd, NtSetSystemTime, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00ce, NtSetThreadExecutionState, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00cf, NtSetTimer, 28 ) \
|
||||
SYSCALL_ENTRY( 0x00d0, NtSetTimerResolution, 12 ) \
|
||||
SYSCALL_ENTRY( 0x00d1, NtSetValueKey, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00d2, NtSetVolumeInformationFile, 20 ) \
|
||||
SYSCALL_ENTRY( 0x00d3, NtShutdownSystem, 4 ) \
|
||||
SYSCALL_ENTRY( 0x00d4, NtSignalAndWaitForSingleObject, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00d5, NtSuspendProcess, 4 ) \
|
||||
SYSCALL_ENTRY( 0x00d6, NtSuspendThread, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00d7, NtSystemDebugControl, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00d8, NtTerminateJobObject, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00d9, NtTerminateProcess, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00da, NtTerminateThread, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00db, NtTestAlert, 0 ) \
|
||||
SYSCALL_ENTRY( 0x00dc, NtTraceControl, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00dd, NtUnloadDriver, 4 ) \
|
||||
SYSCALL_ENTRY( 0x00de, NtUnloadKey, 4 ) \
|
||||
SYSCALL_ENTRY( 0x00df, NtUnlockFile, 20 ) \
|
||||
SYSCALL_ENTRY( 0x00e0, NtUnlockVirtualMemory, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00e1, NtUnmapViewOfSection, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00e2, NtUnmapViewOfSectionEx, 12 ) \
|
||||
SYSCALL_ENTRY( 0x00e3, NtWaitForAlertByThreadId, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00e4, NtWaitForDebugEvent, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00e5, NtWaitForKeyedEvent, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00e6, NtWaitForMultipleObjects, 20 ) \
|
||||
SYSCALL_ENTRY( 0x00e7, NtWaitForSingleObject, 12 ) \
|
||||
SYSCALL_ENTRY( 0x00e8, NtWow64AllocateVirtualMemory64, 28 ) \
|
||||
SYSCALL_ENTRY( 0x00e9, NtWow64GetNativeSystemInformation, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00ea, NtWow64IsProcessorFeaturePresent, 4 ) \
|
||||
SYSCALL_ENTRY( 0x00eb, NtWow64QueryInformationProcess64, 20 ) \
|
||||
SYSCALL_ENTRY( 0x00ec, NtWow64ReadVirtualMemory64, 28 ) \
|
||||
SYSCALL_ENTRY( 0x00ed, NtWow64WriteVirtualMemory64, 28 ) \
|
||||
SYSCALL_ENTRY( 0x00ee, NtWriteFile, 36 ) \
|
||||
SYSCALL_ENTRY( 0x00ef, NtWriteFileGather, 36 ) \
|
||||
SYSCALL_ENTRY( 0x00f0, NtWriteVirtualMemory, 20 ) \
|
||||
SYSCALL_ENTRY( 0x00f1, NtYieldExecution, 0 ) \
|
||||
SYSCALL_ENTRY( 0x00f2, wine_nt_to_unix_file_name, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00f3, wine_unix_to_nt_file_name, 12 )
|
||||
SYSCALL_ENTRY( 0x00ca, NtSetIoCompletionEx, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00cb, NtSetLdtEntries, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00cc, NtSetSecurityObject, 12 ) \
|
||||
SYSCALL_ENTRY( 0x00cd, NtSetSystemInformation, 12 ) \
|
||||
SYSCALL_ENTRY( 0x00ce, NtSetSystemTime, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00cf, NtSetThreadExecutionState, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00d0, NtSetTimer, 28 ) \
|
||||
SYSCALL_ENTRY( 0x00d1, NtSetTimerResolution, 12 ) \
|
||||
SYSCALL_ENTRY( 0x00d2, NtSetValueKey, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00d3, NtSetVolumeInformationFile, 20 ) \
|
||||
SYSCALL_ENTRY( 0x00d4, NtShutdownSystem, 4 ) \
|
||||
SYSCALL_ENTRY( 0x00d5, NtSignalAndWaitForSingleObject, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00d6, NtSuspendProcess, 4 ) \
|
||||
SYSCALL_ENTRY( 0x00d7, NtSuspendThread, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00d8, NtSystemDebugControl, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00d9, NtTerminateJobObject, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00da, NtTerminateProcess, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00db, NtTerminateThread, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00dc, NtTestAlert, 0 ) \
|
||||
SYSCALL_ENTRY( 0x00dd, NtTraceControl, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00de, NtUnloadDriver, 4 ) \
|
||||
SYSCALL_ENTRY( 0x00df, NtUnloadKey, 4 ) \
|
||||
SYSCALL_ENTRY( 0x00e0, NtUnlockFile, 20 ) \
|
||||
SYSCALL_ENTRY( 0x00e1, NtUnlockVirtualMemory, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00e2, NtUnmapViewOfSection, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00e3, NtUnmapViewOfSectionEx, 12 ) \
|
||||
SYSCALL_ENTRY( 0x00e4, NtWaitForAlertByThreadId, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00e5, NtWaitForDebugEvent, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00e6, NtWaitForKeyedEvent, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00e7, NtWaitForMultipleObjects, 20 ) \
|
||||
SYSCALL_ENTRY( 0x00e8, NtWaitForSingleObject, 12 ) \
|
||||
SYSCALL_ENTRY( 0x00e9, NtWow64AllocateVirtualMemory64, 28 ) \
|
||||
SYSCALL_ENTRY( 0x00ea, NtWow64GetNativeSystemInformation, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00eb, NtWow64IsProcessorFeaturePresent, 4 ) \
|
||||
SYSCALL_ENTRY( 0x00ec, NtWow64QueryInformationProcess64, 20 ) \
|
||||
SYSCALL_ENTRY( 0x00ed, NtWow64ReadVirtualMemory64, 28 ) \
|
||||
SYSCALL_ENTRY( 0x00ee, NtWow64WriteVirtualMemory64, 28 ) \
|
||||
SYSCALL_ENTRY( 0x00ef, NtWriteFile, 36 ) \
|
||||
SYSCALL_ENTRY( 0x00f0, NtWriteFileGather, 36 ) \
|
||||
SYSCALL_ENTRY( 0x00f1, NtWriteVirtualMemory, 20 ) \
|
||||
SYSCALL_ENTRY( 0x00f2, NtYieldExecution, 0 ) \
|
||||
SYSCALL_ENTRY( 0x00f3, wine_nt_to_unix_file_name, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00f4, wine_unix_to_nt_file_name, 12 )
|
||||
|
||||
#define ALL_SYSCALLS64 \
|
||||
SYSCALL_ENTRY( 0x0000, NtAcceptConnectPort, 48 ) \
|
||||
|
@ -449,39 +450,40 @@
|
|||
SYSCALL_ENTRY( 0x00c7, NtSetInformationVirtualMemory, 48 ) \
|
||||
SYSCALL_ENTRY( 0x00c8, NtSetIntervalProfile, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00c9, NtSetIoCompletion, 40 ) \
|
||||
SYSCALL_ENTRY( 0x00ca, NtSetLdtEntries, 32 ) \
|
||||
SYSCALL_ENTRY( 0x00cb, NtSetSecurityObject, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00cc, NtSetSystemInformation, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00cd, NtSetSystemTime, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00ce, NtSetThreadExecutionState, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00cf, NtSetTimer, 56 ) \
|
||||
SYSCALL_ENTRY( 0x00d0, NtSetTimerResolution, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00d1, NtSetValueKey, 48 ) \
|
||||
SYSCALL_ENTRY( 0x00d2, NtSetVolumeInformationFile, 40 ) \
|
||||
SYSCALL_ENTRY( 0x00d3, NtShutdownSystem, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00d4, NtSignalAndWaitForSingleObject, 32 ) \
|
||||
SYSCALL_ENTRY( 0x00d5, NtSuspendProcess, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00d6, NtSuspendThread, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00d7, NtSystemDebugControl, 48 ) \
|
||||
SYSCALL_ENTRY( 0x00d8, NtTerminateJobObject, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00d9, NtTerminateProcess, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00da, NtTerminateThread, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00db, NtTestAlert, 0 ) \
|
||||
SYSCALL_ENTRY( 0x00dc, NtTraceControl, 48 ) \
|
||||
SYSCALL_ENTRY( 0x00dd, NtUnloadDriver, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00de, NtUnloadKey, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00df, NtUnlockFile, 40 ) \
|
||||
SYSCALL_ENTRY( 0x00e0, NtUnlockVirtualMemory, 32 ) \
|
||||
SYSCALL_ENTRY( 0x00e1, NtUnmapViewOfSection, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00e2, NtUnmapViewOfSectionEx, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00e3, NtWaitForAlertByThreadId, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00e4, NtWaitForDebugEvent, 32 ) \
|
||||
SYSCALL_ENTRY( 0x00e5, NtWaitForKeyedEvent, 32 ) \
|
||||
SYSCALL_ENTRY( 0x00e6, NtWaitForMultipleObjects, 40 ) \
|
||||
SYSCALL_ENTRY( 0x00e7, NtWaitForSingleObject, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00e8, NtWriteFile, 72 ) \
|
||||
SYSCALL_ENTRY( 0x00e9, NtWriteFileGather, 72 ) \
|
||||
SYSCALL_ENTRY( 0x00ea, NtWriteVirtualMemory, 40 ) \
|
||||
SYSCALL_ENTRY( 0x00eb, NtYieldExecution, 0 ) \
|
||||
SYSCALL_ENTRY( 0x00ec, wine_nt_to_unix_file_name, 32 ) \
|
||||
SYSCALL_ENTRY( 0x00ed, wine_unix_to_nt_file_name, 24 )
|
||||
SYSCALL_ENTRY( 0x00ca, NtSetIoCompletionEx, 48 ) \
|
||||
SYSCALL_ENTRY( 0x00cb, NtSetLdtEntries, 32 ) \
|
||||
SYSCALL_ENTRY( 0x00cc, NtSetSecurityObject, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00cd, NtSetSystemInformation, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00ce, NtSetSystemTime, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00cf, NtSetThreadExecutionState, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00d0, NtSetTimer, 56 ) \
|
||||
SYSCALL_ENTRY( 0x00d1, NtSetTimerResolution, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00d2, NtSetValueKey, 48 ) \
|
||||
SYSCALL_ENTRY( 0x00d3, NtSetVolumeInformationFile, 40 ) \
|
||||
SYSCALL_ENTRY( 0x00d4, NtShutdownSystem, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00d5, NtSignalAndWaitForSingleObject, 32 ) \
|
||||
SYSCALL_ENTRY( 0x00d6, NtSuspendProcess, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00d7, NtSuspendThread, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00d8, NtSystemDebugControl, 48 ) \
|
||||
SYSCALL_ENTRY( 0x00d9, NtTerminateJobObject, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00da, NtTerminateProcess, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00db, NtTerminateThread, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00dc, NtTestAlert, 0 ) \
|
||||
SYSCALL_ENTRY( 0x00dd, NtTraceControl, 48 ) \
|
||||
SYSCALL_ENTRY( 0x00de, NtUnloadDriver, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00df, NtUnloadKey, 8 ) \
|
||||
SYSCALL_ENTRY( 0x00e0, NtUnlockFile, 40 ) \
|
||||
SYSCALL_ENTRY( 0x00e1, NtUnlockVirtualMemory, 32 ) \
|
||||
SYSCALL_ENTRY( 0x00e2, NtUnmapViewOfSection, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00e3, NtUnmapViewOfSectionEx, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00e4, NtWaitForAlertByThreadId, 16 ) \
|
||||
SYSCALL_ENTRY( 0x00e5, NtWaitForDebugEvent, 32 ) \
|
||||
SYSCALL_ENTRY( 0x00e6, NtWaitForKeyedEvent, 32 ) \
|
||||
SYSCALL_ENTRY( 0x00e7, NtWaitForMultipleObjects, 40 ) \
|
||||
SYSCALL_ENTRY( 0x00e8, NtWaitForSingleObject, 24 ) \
|
||||
SYSCALL_ENTRY( 0x00e9, NtWriteFile, 72 ) \
|
||||
SYSCALL_ENTRY( 0x00ea, NtWriteFileGather, 72 ) \
|
||||
SYSCALL_ENTRY( 0x00eb, NtWriteVirtualMemory, 40 ) \
|
||||
SYSCALL_ENTRY( 0x00ec, NtYieldExecution, 0 ) \
|
||||
SYSCALL_ENTRY( 0x00ed, wine_nt_to_unix_file_name, 32 ) \
|
||||
SYSCALL_ENTRY( 0x00ee, wine_unix_to_nt_file_name, 24 )
|
||||
|
|
|
@ -443,6 +443,7 @@ DEFINE_SYSCALL(NtSetInformationToken, (HANDLE token, TOKEN_INFORMATION_CLASS cla
|
|||
DEFINE_SYSCALL(NtSetInformationVirtualMemory, (HANDLE process, VIRTUAL_MEMORY_INFORMATION_CLASS info_class, ULONG_PTR count, PMEMORY_RANGE_ENTRY addresses, PVOID ptr, ULONG size))
|
||||
DEFINE_SYSCALL(NtSetIntervalProfile, (ULONG interval, KPROFILE_SOURCE source))
|
||||
DEFINE_SYSCALL(NtSetIoCompletion, (HANDLE handle, ULONG_PTR key, ULONG_PTR value, NTSTATUS status, SIZE_T count))
|
||||
DEFINE_SYSCALL(NtSetIoCompletionEx, (HANDLE completion_handle, HANDLE completion_reserve_handle, ULONG_PTR key, ULONG_PTR value, NTSTATUS status, SIZE_T count))
|
||||
DEFINE_SYSCALL(NtSetLdtEntries, (ULONG sel1, LDT_ENTRY entry1, ULONG sel2, LDT_ENTRY entry2))
|
||||
DEFINE_SYSCALL(NtSetSecurityObject, (HANDLE handle, SECURITY_INFORMATION info, PSECURITY_DESCRIPTOR descr))
|
||||
DEFINE_SYSCALL(NtSetSystemInformation, (SYSTEM_INFORMATION_CLASS class, void *info, ULONG length))
|
||||
|
|
|
@ -5945,7 +5945,6 @@ static void test_set_io_completion_ex(void)
|
|||
|
||||
if (!pNtSetIoCompletionEx || !pNtAllocateReserveObject)
|
||||
{
|
||||
todo_wine
|
||||
win_skip("NtSetIoCompletionEx() or NtAllocateReserveObject() is unavailable.\n");
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -1992,6 +1992,35 @@ NTSTATUS WINAPI NtSetIoCompletion( HANDLE handle, ULONG_PTR key, ULONG_PTR value
|
|||
return ret;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* NtSetIoCompletionEx (NTDLL.@)
|
||||
*
|
||||
* completion_reserve_handle is a handle allocated by NtAllocateReserveObject() for pre-allocating
|
||||
* memory for completion objects to deal with low-memory situations. It's not in use for now.
|
||||
*/
|
||||
NTSTATUS WINAPI NtSetIoCompletionEx( HANDLE completion_handle, HANDLE completion_reserve_handle,
|
||||
ULONG_PTR key, ULONG_PTR value, NTSTATUS status, SIZE_T count )
|
||||
{
|
||||
unsigned int ret;
|
||||
|
||||
TRACE( "(%p, %p, %lx, %lx, %x, %lx)\n", completion_handle, completion_reserve_handle,
|
||||
key, value, (int)status, count );
|
||||
|
||||
if (!completion_reserve_handle) return STATUS_INVALID_HANDLE;
|
||||
|
||||
SERVER_START_REQ( add_completion )
|
||||
{
|
||||
req->handle = wine_server_obj_handle( completion_handle );
|
||||
req->ckey = key;
|
||||
req->cvalue = value;
|
||||
req->status = status;
|
||||
req->information = count;
|
||||
req->reserve_handle = wine_server_obj_handle( completion_reserve_handle );
|
||||
ret = wine_server_call( req );
|
||||
}
|
||||
SERVER_END_REQ;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* NtRemoveIoCompletion (NTDLL.@)
|
||||
|
|
|
@ -1525,6 +1525,7 @@
|
|||
@ stdcall -private ZwSetInformationToken(long long ptr long) NtSetInformationToken
|
||||
@ stdcall -private ZwSetIntervalProfile(long long) NtSetIntervalProfile
|
||||
@ stdcall -private ZwSetIoCompletion(ptr long long long long) NtSetIoCompletion
|
||||
@ stdcall -private ZwSetIoCompletionEx(ptr ptr long long long long) NtSetIoCompletionEx
|
||||
@ stdcall -private ZwSetSecurityObject(long long ptr) NtSetSecurityObject
|
||||
@ stdcall -private ZwSetSystemInformation(long ptr long) NtSetSystemInformation
|
||||
@ stdcall -private ZwSetSystemTime(ptr ptr) NtSetSystemTime
|
||||
|
|
|
@ -1449,6 +1449,22 @@ NTSTATUS WINAPI wow64_NtSetIoCompletion( UINT *args )
|
|||
}
|
||||
|
||||
|
||||
/**********************************************************************
|
||||
* wow64_NtSetIoCompletionEx
|
||||
*/
|
||||
NTSTATUS WINAPI wow64_NtSetIoCompletionEx( UINT *args )
|
||||
{
|
||||
HANDLE completion_handle = get_handle( &args );
|
||||
HANDLE completion_reserve_handle = get_handle( &args );
|
||||
ULONG_PTR key = get_ulong( &args );
|
||||
ULONG_PTR value = get_ulong( &args );
|
||||
NTSTATUS status = get_ulong( &args );
|
||||
SIZE_T count = get_ulong( &args );
|
||||
|
||||
return NtSetIoCompletionEx( completion_handle, completion_reserve_handle, key, value, status, count );
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************************
|
||||
* wow64_NtSetTimer
|
||||
*/
|
||||
|
|
|
@ -5412,8 +5412,8 @@ struct add_completion_request
|
|||
apc_param_t ckey;
|
||||
apc_param_t cvalue;
|
||||
apc_param_t information;
|
||||
obj_handle_t reserve_handle;
|
||||
unsigned int status;
|
||||
char __pad_44[4];
|
||||
};
|
||||
struct add_completion_reply
|
||||
{
|
||||
|
@ -6760,7 +6760,7 @@ union generic_reply
|
|||
|
||||
/* ### protocol_version begin ### */
|
||||
|
||||
#define SERVER_PROTOCOL_VERSION 847
|
||||
#define SERVER_PROTOCOL_VERSION 848
|
||||
|
||||
/* ### protocol_version end ### */
|
||||
|
||||
|
|
|
@ -4675,6 +4675,7 @@ NTSYSAPI NTSTATUS WINAPI NtSetInformationToken(HANDLE,TOKEN_INFORMATION_CLASS,P
|
|||
NTSYSAPI NTSTATUS WINAPI NtSetInformationVirtualMemory(HANDLE,VIRTUAL_MEMORY_INFORMATION_CLASS,ULONG_PTR,PMEMORY_RANGE_ENTRY,PVOID,ULONG);
|
||||
NTSYSAPI NTSTATUS WINAPI NtSetIntervalProfile(ULONG,KPROFILE_SOURCE);
|
||||
NTSYSAPI NTSTATUS WINAPI NtSetIoCompletion(HANDLE,ULONG_PTR,ULONG_PTR,NTSTATUS,SIZE_T);
|
||||
NTSYSAPI NTSTATUS WINAPI NtSetIoCompletionEx(HANDLE,HANDLE,ULONG_PTR,ULONG_PTR,NTSTATUS,SIZE_T);
|
||||
NTSYSAPI NTSTATUS WINAPI NtSetLdtEntries(ULONG,LDT_ENTRY,ULONG,LDT_ENTRY);
|
||||
NTSYSAPI NTSTATUS WINAPI NtSetLowEventPair(HANDLE);
|
||||
NTSYSAPI NTSTATUS WINAPI NtSetLowWaitHighEventPair(HANDLE);
|
||||
|
|
|
@ -344,11 +344,19 @@ DECL_HANDLER(open_completion)
|
|||
DECL_HANDLER(add_completion)
|
||||
{
|
||||
struct completion* completion = get_completion_obj( current->process, req->handle, IO_COMPLETION_MODIFY_STATE );
|
||||
struct reserve *reserve = NULL;
|
||||
|
||||
if (!completion) return;
|
||||
|
||||
if (req->reserve_handle && !(reserve = get_completion_reserve_obj( current->process, req->reserve_handle, 0 )))
|
||||
{
|
||||
release_object( completion );
|
||||
return;
|
||||
}
|
||||
|
||||
add_completion( completion, req->ckey, req->cvalue, req->status, req->information );
|
||||
|
||||
if (reserve) release_object( reserve );
|
||||
release_object( completion );
|
||||
}
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ struct fd;
|
|||
struct mapping;
|
||||
struct async_queue;
|
||||
struct completion;
|
||||
struct reserve;
|
||||
|
||||
/* server-side representation of I/O status block */
|
||||
struct iosb
|
||||
|
@ -236,6 +237,7 @@ extern struct dir *get_dir_obj( struct process *process, obj_handle_t handle, un
|
|||
/* completion */
|
||||
|
||||
extern struct completion *get_completion_obj( struct process *process, obj_handle_t handle, unsigned int access );
|
||||
extern struct reserve *get_completion_reserve_obj( struct process *process, obj_handle_t handle, unsigned int access );
|
||||
extern void add_completion( struct completion *completion, apc_param_t ckey, apc_param_t cvalue,
|
||||
unsigned int status, apc_param_t information );
|
||||
extern void cleanup_thread_completion( struct thread *thread );
|
||||
|
|
|
@ -854,6 +854,11 @@ static struct reserve *create_reserve( struct object *root, const struct unicode
|
|||
return reserve;
|
||||
}
|
||||
|
||||
struct reserve *get_completion_reserve_obj( struct process *process, obj_handle_t handle, unsigned int access )
|
||||
{
|
||||
return (struct reserve *)get_handle_obj( process, handle, access, &completion_reserve_ops );
|
||||
}
|
||||
|
||||
/* Allocate a reserve object for pre-allocating memory for object types */
|
||||
DECL_HANDLER(allocate_reserve_object)
|
||||
{
|
||||
|
|
|
@ -3803,6 +3803,7 @@ typedef union
|
|||
apc_param_t ckey; /* completion key */
|
||||
apc_param_t cvalue; /* completion value */
|
||||
apc_param_t information; /* IO_STATUS_BLOCK Information */
|
||||
obj_handle_t reserve_handle; /* completion reserve object handle */
|
||||
unsigned int status; /* completion result */
|
||||
@END
|
||||
|
||||
|
|
|
@ -2237,7 +2237,8 @@ C_ASSERT( FIELD_OFFSET(struct add_completion_request, handle) == 12 );
|
|||
C_ASSERT( FIELD_OFFSET(struct add_completion_request, ckey) == 16 );
|
||||
C_ASSERT( FIELD_OFFSET(struct add_completion_request, cvalue) == 24 );
|
||||
C_ASSERT( FIELD_OFFSET(struct add_completion_request, information) == 32 );
|
||||
C_ASSERT( FIELD_OFFSET(struct add_completion_request, status) == 40 );
|
||||
C_ASSERT( FIELD_OFFSET(struct add_completion_request, reserve_handle) == 40 );
|
||||
C_ASSERT( FIELD_OFFSET(struct add_completion_request, status) == 44 );
|
||||
C_ASSERT( sizeof(struct add_completion_request) == 48 );
|
||||
C_ASSERT( FIELD_OFFSET(struct remove_completion_request, handle) == 12 );
|
||||
C_ASSERT( FIELD_OFFSET(struct remove_completion_request, alertable) == 16 );
|
||||
|
|
|
@ -4536,6 +4536,7 @@ static void dump_add_completion_request( const struct add_completion_request *re
|
|||
dump_uint64( ", ckey=", &req->ckey );
|
||||
dump_uint64( ", cvalue=", &req->cvalue );
|
||||
dump_uint64( ", information=", &req->information );
|
||||
fprintf( stderr, ", reserve_handle=%04x", req->reserve_handle );
|
||||
fprintf( stderr, ", status=%08x", req->status );
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue