From 5267fccae6bd10d899bbc41e1efc5d1113ba062b Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Fri, 9 Dec 2022 20:05:15 +0300 Subject: [PATCH] ktmw32: Use syscall interface for transaction objects stubs. Signed-off-by: Nikolay Sivov --- dlls/ktmw32/ktmw32_main.c | 46 +++++++++++++++++++++++---------- dlls/ntdll/ntdll.spec | 3 +++ dlls/ntdll/unix/loader.c | 3 +++ dlls/ntdll/unix/sync.c | 34 ++++++++++++++++++++++++ dlls/wow64/sync.c | 54 +++++++++++++++++++++++++++++++++++++++ dlls/wow64/syscall.h | 3 +++ include/winternl.h | 3 +++ 7 files changed, 133 insertions(+), 13 deletions(-) diff --git a/dlls/ktmw32/ktmw32_main.c b/dlls/ktmw32/ktmw32_main.c index 710683aff36..af9db28530f 100644 --- a/dlls/ktmw32/ktmw32_main.c +++ b/dlls/ktmw32/ktmw32_main.c @@ -22,39 +22,59 @@ #include "windef.h" #include "winbase.h" -#include "wine/debug.h" +#include "winternl.h" -WINE_DEFAULT_DEBUG_CHANNEL(ktmw32); +static inline BOOL set_ntstatus( NTSTATUS status ) +{ + if (status) RtlSetLastWin32Error( RtlNtStatusToDosError( status )); + return !status; +} +static inline LARGE_INTEGER *get_nt_timeout( LARGE_INTEGER *time, DWORD timeout ) +{ + if (timeout == INFINITE) return NULL; + time->QuadPart = (ULONGLONG)timeout * -10000; + return time; +} /*********************************************************************** * CommitTransaction (ktmw32.@) */ BOOL WINAPI CommitTransaction(HANDLE transaction) { - FIXME("(%p): stub\n", transaction); - return TRUE; + return set_ntstatus( NtCommitTransaction( transaction, TRUE )); } /*********************************************************************** * CreateTransaction (ktmw32.@) */ -HANDLE WINAPI CreateTransaction(LPSECURITY_ATTRIBUTES pattr, LPGUID pguid, DWORD options, - DWORD level, DWORD flags, DWORD timeout, LPWSTR description) +HANDLE WINAPI CreateTransaction( SECURITY_ATTRIBUTES *sa, GUID *guid, DWORD options, DWORD level, DWORD flags, + DWORD timeout, WCHAR *desc ) { + ULONG obj_flags = OBJ_CASE_INSENSITIVE; + UNICODE_STRING desc_str; + OBJECT_ATTRIBUTES attr; + LARGE_INTEGER time; + HANDLE handle; - FIXME("(%p %p 0x%lx 0x%lx 0x%lx, %lu, %s): stub\n", - pattr, pguid, options, level, flags, timeout, debugstr_w(description)); + if (sa && sa->bInheritHandle) obj_flags |= OBJ_INHERIT; + InitializeObjectAttributes( &attr, NULL, obj_flags, 0, sa ? sa->lpSecurityDescriptor : NULL ); - return (HANDLE) 1; + RtlInitUnicodeString( &desc_str, desc ); + + if (!set_ntstatus( NtCreateTransaction( &handle, 0 /* FIXME */, &attr, guid, NULL, options, level, flags, + get_nt_timeout( &time, timeout ), &desc_str ))) + { + return INVALID_HANDLE_VALUE; + } + + return handle; } /*********************************************************************** - * Rollback Transaction (ktmw32.@) + * RollbackTransaction (ktmw32.@) */ BOOL WINAPI RollbackTransaction(HANDLE transaction) { - FIXME("stub: %p\n", transaction); - SetLastError(ERROR_ACCESS_DENIED); - return FALSE; + return set_ntstatus( NtRollbackTransaction( transaction, TRUE )); } diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index b41e29c0ff5..b8c23c57283 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -158,6 +158,7 @@ @ stdcall -syscall NtClearEvent(long) @ stdcall -syscall NtClose(long) # @ stub NtCloseObjectAuditAlarm +@ stdcall -syscall NtCommitTransaction(long long) # @ stub NtCompactKeys @ stdcall -syscall NtCompareObjects(ptr ptr) # @ stub NtCompareTokens @@ -192,6 +193,7 @@ @ stdcall -syscall NtCreateThreadEx(ptr long ptr long ptr ptr long long long long ptr) @ stdcall -syscall NtCreateTimer(ptr long ptr long) # @ stub NtCreateToken +@ stdcall -syscall NtCreateTransaction(ptr long ptr ptr long long long long ptr ptr) @ stdcall -syscall NtCreateUserProcess(ptr ptr long long ptr ptr long long ptr ptr ptr) # @ stub NtCreateWaitablePort @ stdcall -arch=i386,arm64 NtCurrentTeb() @@ -365,6 +367,7 @@ @ stdcall -syscall NtRestoreKey(long long long) @ stdcall -syscall NtResumeProcess(long) @ stdcall -syscall NtResumeThread(long ptr) +@ stdcall -syscall NtRollbackTransaction(long long) @ stdcall -syscall NtSaveKey(long long) # @ stub NtSaveKeyEx # @ stub NtSaveMergedKeys diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 2890e05c633..65934acfc36 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -143,6 +143,7 @@ static void * const syscalls[] = NtCancelTimer, NtClearEvent, NtClose, + NtCommitTransaction, NtCompareObjects, NtCompleteConnectPort, NtConnectPort, @@ -168,6 +169,7 @@ static void * const syscalls[] = NtCreateThread, NtCreateThreadEx, NtCreateTimer, + NtCreateTransaction, NtCreateUserProcess, NtDebugActiveProcess, NtDebugContinue, @@ -296,6 +298,7 @@ static void * const syscalls[] = NtRestoreKey, NtResumeProcess, NtResumeThread, + NtRollbackTransaction, NtSaveKey, NtSecureConnectPort, NtSetContextThread, diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c index a0905963562..22a3555ba3f 100644 --- a/dlls/ntdll/unix/sync.c +++ b/dlls/ntdll/unix/sync.c @@ -2561,3 +2561,37 @@ void set_async_direct_result( HANDLE *async_handle, NTSTATUS status, ULONG_PTR i return; } + +/*********************************************************************** + * NtCreateTransaction (NTDLL.@) + */ +NTSTATUS WINAPI NtCreateTransaction( HANDLE *handle, ACCESS_MASK mask, OBJECT_ATTRIBUTES *obj_attr, GUID *guid, HANDLE tm, + ULONG options, ULONG isol_level, ULONG isol_flags, PLARGE_INTEGER timeout, UNICODE_STRING *description ) +{ + FIXME( "%p, %#x, %p, %s, %p, 0x%08x, 0x%08x, 0x%08x, %p, %p stub.\n", handle, (int)mask, obj_attr, debugstr_guid(guid), tm, + (int)options, (int)isol_level, (int)isol_flags, timeout, description ); + + *handle = ULongToHandle(1); + + return STATUS_SUCCESS; +} + +/*********************************************************************** + * NtCommitTransaction (NTDLL.@) + */ +NTSTATUS WINAPI NtCommitTransaction( HANDLE transaction, BOOLEAN wait ) +{ + FIXME( "%p, %d stub.\n", transaction, wait ); + + return STATUS_SUCCESS; +} + +/*********************************************************************** + * NtRollbackTransaction (NTDLL.@) + */ +NTSTATUS WINAPI NtRollbackTransaction( HANDLE transaction, BOOLEAN wait ) +{ + FIXME( "%p, %d stub.\n", transaction, wait ); + + return STATUS_ACCESS_VIOLATION; +} diff --git a/dlls/wow64/sync.c b/dlls/wow64/sync.c index 578ef57201f..bf42f43b7e6 100644 --- a/dlls/wow64/sync.c +++ b/dlls/wow64/sync.c @@ -1617,3 +1617,57 @@ NTSTATUS WINAPI wow64_NtYieldExecution( UINT *args ) { return NtYieldExecution(); } + + +/********************************************************************** + * wow64_NtCreateTransaction + */ +NTSTATUS WINAPI wow64_NtCreateTransaction( UINT *args ) +{ + ULONG *handle_ptr = get_ptr( &args ); + ACCESS_MASK access = get_ulong( &args ); + OBJECT_ATTRIBUTES32 *attr32 = get_ptr( &args ); + GUID *guid = get_ptr( &args ); + HANDLE tm = get_handle( &args ); + ULONG options = get_ulong( &args ); + ULONG isol_level = get_ulong( &args ); + ULONG isol_flags = get_ulong( &args ); + LARGE_INTEGER *timeout = get_ptr( &args ); + UNICODE_STRING32 *desc32 = get_ptr( &args ); + + struct object_attr64 attr; + UNICODE_STRING desc; + HANDLE handle = 0; + NTSTATUS status; + + *handle_ptr = 0; + status = NtCreateTransaction( &handle, access, objattr_32to64( &attr, attr32 ), guid, tm, options, + isol_level, isol_flags, timeout, unicode_str_32to64( &desc, desc32 )); + put_handle( handle_ptr, handle ); + + return status; +} + + +/********************************************************************** + * wow64_NtCommitTransaction + */ +NTSTATUS WINAPI wow64_NtCommitTransaction( UINT *args ) +{ + HANDLE handle = get_handle( &args ); + BOOLEAN wait = get_ulong( &args ); + + return NtCommitTransaction( handle, wait ); +} + + +/********************************************************************** + * wow64_NtRollbackTransaction + */ +NTSTATUS WINAPI wow64_NtRollbackTransaction( UINT *args ) +{ + HANDLE handle = get_handle( &args ); + BOOLEAN wait = get_ulong( &args ); + + return NtRollbackTransaction( handle, wait ); +} diff --git a/dlls/wow64/syscall.h b/dlls/wow64/syscall.h index d4216b8c04c..466821146e6 100644 --- a/dlls/wow64/syscall.h +++ b/dlls/wow64/syscall.h @@ -44,6 +44,7 @@ SYSCALL_ENTRY( NtCancelTimer ) \ SYSCALL_ENTRY( NtClearEvent ) \ SYSCALL_ENTRY( NtClose ) \ + SYSCALL_ENTRY( NtCommitTransaction ) \ SYSCALL_ENTRY( NtCompareObjects ) \ SYSCALL_ENTRY( NtCompleteConnectPort ) \ SYSCALL_ENTRY( NtConnectPort ) \ @@ -69,6 +70,7 @@ SYSCALL_ENTRY( NtCreateThread ) \ SYSCALL_ENTRY( NtCreateThreadEx ) \ SYSCALL_ENTRY( NtCreateTimer ) \ + SYSCALL_ENTRY( NtCreateTransaction ) \ SYSCALL_ENTRY( NtCreateUserProcess ) \ SYSCALL_ENTRY( NtDebugActiveProcess ) \ SYSCALL_ENTRY( NtDebugContinue ) \ @@ -197,6 +199,7 @@ SYSCALL_ENTRY( NtRestoreKey ) \ SYSCALL_ENTRY( NtResumeProcess ) \ SYSCALL_ENTRY( NtResumeThread ) \ + SYSCALL_ENTRY( NtRollbackTransaction ) \ SYSCALL_ENTRY( NtSaveKey ) \ SYSCALL_ENTRY( NtSecureConnectPort ) \ SYSCALL_ENTRY( NtSetContextThread ) \ diff --git a/include/winternl.h b/include/winternl.h index c720d962933..4097a574e34 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -3983,6 +3983,7 @@ NTSYSAPI NTSTATUS WINAPI NtCancelTimer(HANDLE, BOOLEAN*); NTSYSAPI NTSTATUS WINAPI NtClearEvent(HANDLE); NTSYSAPI NTSTATUS WINAPI NtClose(HANDLE); NTSYSAPI NTSTATUS WINAPI NtCloseObjectAuditAlarm(PUNICODE_STRING,HANDLE,BOOLEAN); +NTSYSAPI NTSTATUS WINAPI NtCommitTransaction(HANDLE,BOOLEAN); NTSYSAPI NTSTATUS WINAPI NtCompareObjects(HANDLE,HANDLE); NTSYSAPI NTSTATUS WINAPI NtCompleteConnectPort(HANDLE); NTSYSAPI NTSTATUS WINAPI NtConnectPort(PHANDLE,PUNICODE_STRING,PSECURITY_QUALITY_OF_SERVICE,PLPC_SECTION_WRITE,PLPC_SECTION_READ,PULONG,PVOID,PULONG); @@ -4012,6 +4013,7 @@ NTSYSAPI NTSTATUS WINAPI NtCreateThread(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES, NTSYSAPI NTSTATUS WINAPI NtCreateThreadEx(HANDLE*,ACCESS_MASK,OBJECT_ATTRIBUTES*,HANDLE,PRTL_THREAD_START_ROUTINE,void*,ULONG,ULONG_PTR,SIZE_T,SIZE_T,PS_ATTRIBUTE_LIST*); NTSYSAPI NTSTATUS WINAPI NtCreateTimer(HANDLE*, ACCESS_MASK, const OBJECT_ATTRIBUTES*, TIMER_TYPE); NTSYSAPI NTSTATUS WINAPI NtCreateToken(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,TOKEN_TYPE,PLUID,PLARGE_INTEGER,PTOKEN_USER,PTOKEN_GROUPS,PTOKEN_PRIVILEGES,PTOKEN_OWNER,PTOKEN_PRIMARY_GROUP,PTOKEN_DEFAULT_DACL,PTOKEN_SOURCE); +NTSYSAPI NTSTATUS WINAPI NtCreateTransaction(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,LPGUID,HANDLE,ULONG,ULONG,ULONG,PLARGE_INTEGER,PUNICODE_STRING); NTSYSAPI NTSTATUS WINAPI NtCreateUserProcess(HANDLE*,HANDLE*,ACCESS_MASK,ACCESS_MASK,OBJECT_ATTRIBUTES*,OBJECT_ATTRIBUTES*,ULONG,ULONG,RTL_USER_PROCESS_PARAMETERS*,PS_CREATE_INFO*,PS_ATTRIBUTE_LIST*); NTSYSAPI NTSTATUS WINAPI NtDebugActiveProcess(HANDLE,HANDLE); NTSYSAPI NTSTATUS WINAPI NtDebugContinue(HANDLE,CLIENT_ID*,NTSTATUS); @@ -4159,6 +4161,7 @@ NTSYSAPI NTSTATUS WINAPI NtResetWriteWatch(HANDLE,PVOID,SIZE_T); NTSYSAPI NTSTATUS WINAPI NtRestoreKey(HANDLE,HANDLE,ULONG); NTSYSAPI NTSTATUS WINAPI NtResumeProcess(HANDLE); NTSYSAPI NTSTATUS WINAPI NtResumeThread(HANDLE,PULONG); +NTSYSAPI NTSTATUS WINAPI NtRollbackTransaction(HANDLE,BOOLEAN); NTSYSAPI NTSTATUS WINAPI NtSaveKey(HANDLE,HANDLE); NTSYSAPI NTSTATUS WINAPI NtSecureConnectPort(PHANDLE,PUNICODE_STRING,PSECURITY_QUALITY_OF_SERVICE,PLPC_SECTION_WRITE,PSID,PLPC_SECTION_READ,PULONG,PVOID,PULONG); NTSYSAPI NTSTATUS WINAPI NtSetContextThread(HANDLE,const CONTEXT*);