Commit 1fd62642 authored by Alexandre Julliard's avatar Alexandre Julliard

Fixed the FIXME in RtlNtStatusToDosError, and implemented

RtlGetLastNtStatus and RtlSetLastWin32ErrorAndNtStatusFromNtStatus.
parent 646ab89f
...@@ -97,11 +97,21 @@ ULONG WINAPI RtlNtStatusToDosErrorNoTeb( NTSTATUS status ) ...@@ -97,11 +97,21 @@ ULONG WINAPI RtlNtStatusToDosErrorNoTeb( NTSTATUS status )
*/ */
ULONG WINAPI RtlNtStatusToDosError( NTSTATUS status ) ULONG WINAPI RtlNtStatusToDosError( NTSTATUS status )
{ {
/* FIXME: This function obviously does something with the Teb */ NtCurrentTeb()->LastStatusValue = status;
return RtlNtStatusToDosErrorNoTeb( status ); return RtlNtStatusToDosErrorNoTeb( status );
} }
/********************************************************************** /**********************************************************************
* RtlGetLastNtStatus (NTDLL.@)
*
* Get the current per-thread status.
*/
NTSTATUS WINAPI RtlGetLastNtStatus(void)
{
return NtCurrentTeb()->LastStatusValue;
}
/**********************************************************************
* RtlGetLastWin32Error (NTDLL.@) * RtlGetLastWin32Error (NTDLL.@)
* *
* Get the current per-thread error value set by a system function or the user. * Get the current per-thread error value set by a system function or the user.
...@@ -131,6 +141,19 @@ void WINAPI RtlSetLastWin32Error( DWORD err ) ...@@ -131,6 +141,19 @@ void WINAPI RtlSetLastWin32Error( DWORD err )
NtCurrentTeb()->LastErrorValue = err; NtCurrentTeb()->LastErrorValue = err;
} }
/***********************************************************************
* RtlSetLastWin32ErrorAndNtStatusFromNtStatus (NTDLL.@)
*
* Set the per-thread status and error values.
*
* PARAMS
* err [I] The new status value to set
*/
void WINAPI RtlSetLastWin32ErrorAndNtStatusFromNtStatus( NTSTATUS status )
{
NtCurrentTeb()->LastErrorValue = RtlNtStatusToDosError( status );
}
/* conversion tables */ /* conversion tables */
static const DWORD table_00000102[32] = static const DWORD table_00000102[32] =
......
...@@ -132,12 +132,6 @@ static HEAP *firstHeap; /* head of secondary heaps list */ ...@@ -132,12 +132,6 @@ static HEAP *firstHeap; /* head of secondary heaps list */
static BOOL HEAP_IsRealArena( HEAP *heapPtr, DWORD flags, LPCVOID block, BOOL quiet ); static BOOL HEAP_IsRealArena( HEAP *heapPtr, DWORD flags, LPCVOID block, BOOL quiet );
/* SetLastError for ntdll */
inline static void set_status( NTSTATUS status )
{
NtCurrentTeb()->LastErrorValue = RtlNtStatusToDosError( status );
}
/* mark a block of memory as free for debugging purposes */ /* mark a block of memory as free for debugging purposes */
static inline void mark_block_free( void *ptr, size_t size ) static inline void mark_block_free( void *ptr, size_t size )
{ {
...@@ -1179,7 +1173,7 @@ BOOLEAN WINAPI RtlFreeHeap( HANDLE heap, ULONG flags, PVOID ptr ) ...@@ -1179,7 +1173,7 @@ BOOLEAN WINAPI RtlFreeHeap( HANDLE heap, ULONG flags, PVOID ptr )
if (!ptr) return TRUE; /* freeing a NULL ptr isn't an error in Win2k */ if (!ptr) return TRUE; /* freeing a NULL ptr isn't an error in Win2k */
if (!heapPtr) if (!heapPtr)
{ {
set_status( STATUS_INVALID_HANDLE ); RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_INVALID_HANDLE );
return FALSE; return FALSE;
} }
...@@ -1189,7 +1183,7 @@ BOOLEAN WINAPI RtlFreeHeap( HANDLE heap, ULONG flags, PVOID ptr ) ...@@ -1189,7 +1183,7 @@ BOOLEAN WINAPI RtlFreeHeap( HANDLE heap, ULONG flags, PVOID ptr )
if (!HEAP_IsRealArena( heapPtr, HEAP_NO_SERIALIZE, ptr, QUIET )) if (!HEAP_IsRealArena( heapPtr, HEAP_NO_SERIALIZE, ptr, QUIET ))
{ {
if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection );
set_status( STATUS_INVALID_PARAMETER ); RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_INVALID_PARAMETER );
TRACE("(%p,%08lx,%08lx): returning FALSE\n", TRACE("(%p,%08lx,%08lx): returning FALSE\n",
heap, flags, (DWORD)ptr ); heap, flags, (DWORD)ptr );
return FALSE; return FALSE;
...@@ -1234,7 +1228,7 @@ PVOID WINAPI RtlReAllocateHeap( HANDLE heap, ULONG flags, PVOID ptr, ULONG size ...@@ -1234,7 +1228,7 @@ PVOID WINAPI RtlReAllocateHeap( HANDLE heap, ULONG flags, PVOID ptr, ULONG size
if (!ptr) return NULL; if (!ptr) return NULL;
if (!(heapPtr = HEAP_GetPtr( heap ))) if (!(heapPtr = HEAP_GetPtr( heap )))
{ {
set_status( STATUS_INVALID_HANDLE ); RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_INVALID_HANDLE );
return NULL; return NULL;
} }
...@@ -1250,7 +1244,7 @@ PVOID WINAPI RtlReAllocateHeap( HANDLE heap, ULONG flags, PVOID ptr, ULONG size ...@@ -1250,7 +1244,7 @@ PVOID WINAPI RtlReAllocateHeap( HANDLE heap, ULONG flags, PVOID ptr, ULONG size
if (!HEAP_IsRealArena( heapPtr, HEAP_NO_SERIALIZE, ptr, QUIET )) if (!HEAP_IsRealArena( heapPtr, HEAP_NO_SERIALIZE, ptr, QUIET ))
{ {
if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection );
set_status( STATUS_INVALID_PARAMETER ); RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_INVALID_PARAMETER );
TRACE("(%p,%08lx,%08lx,%08lx): returning NULL\n", TRACE("(%p,%08lx,%08lx,%08lx): returning NULL\n",
heap, flags, (DWORD)ptr, size ); heap, flags, (DWORD)ptr, size );
return NULL; return NULL;
...@@ -1278,7 +1272,7 @@ PVOID WINAPI RtlReAllocateHeap( HANDLE heap, ULONG flags, PVOID ptr, ULONG size ...@@ -1278,7 +1272,7 @@ PVOID WINAPI RtlReAllocateHeap( HANDLE heap, ULONG flags, PVOID ptr, ULONG size
{ {
if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection );
if (flags & HEAP_GENERATE_EXCEPTIONS) RtlRaiseStatus( STATUS_NO_MEMORY ); if (flags & HEAP_GENERATE_EXCEPTIONS) RtlRaiseStatus( STATUS_NO_MEMORY );
set_status( STATUS_NO_MEMORY ); RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_NO_MEMORY );
return NULL; return NULL;
} }
HEAP_ShrinkBlock( subheap, pArena, size ); HEAP_ShrinkBlock( subheap, pArena, size );
...@@ -1294,7 +1288,7 @@ PVOID WINAPI RtlReAllocateHeap( HANDLE heap, ULONG flags, PVOID ptr, ULONG size ...@@ -1294,7 +1288,7 @@ PVOID WINAPI RtlReAllocateHeap( HANDLE heap, ULONG flags, PVOID ptr, ULONG size
{ {
if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection ); if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveCriticalSection( &heapPtr->critSection );
if (flags & HEAP_GENERATE_EXCEPTIONS) RtlRaiseStatus( STATUS_NO_MEMORY ); if (flags & HEAP_GENERATE_EXCEPTIONS) RtlRaiseStatus( STATUS_NO_MEMORY );
set_status( STATUS_NO_MEMORY ); RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_NO_MEMORY );
return NULL; return NULL;
} }
...@@ -1429,7 +1423,7 @@ ULONG WINAPI RtlSizeHeap( HANDLE heap, ULONG flags, PVOID ptr ) ...@@ -1429,7 +1423,7 @@ ULONG WINAPI RtlSizeHeap( HANDLE heap, ULONG flags, PVOID ptr )
if (!heapPtr) if (!heapPtr)
{ {
set_status( STATUS_INVALID_HANDLE ); RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_INVALID_HANDLE );
return (ULONG)-1; return (ULONG)-1;
} }
flags &= HEAP_NO_SERIALIZE; flags &= HEAP_NO_SERIALIZE;
...@@ -1437,7 +1431,7 @@ ULONG WINAPI RtlSizeHeap( HANDLE heap, ULONG flags, PVOID ptr ) ...@@ -1437,7 +1431,7 @@ ULONG WINAPI RtlSizeHeap( HANDLE heap, ULONG flags, PVOID ptr )
if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterCriticalSection( &heapPtr->critSection ); if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterCriticalSection( &heapPtr->critSection );
if (!HEAP_IsRealArena( heapPtr, HEAP_NO_SERIALIZE, ptr, QUIET )) if (!HEAP_IsRealArena( heapPtr, HEAP_NO_SERIALIZE, ptr, QUIET ))
{ {
set_status( STATUS_INVALID_PARAMETER ); RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_INVALID_PARAMETER );
ret = (ULONG)-1; ret = (ULONG)-1;
} }
else else
......
...@@ -450,6 +450,7 @@ ...@@ -450,6 +450,7 @@
@ stub RtlGetElementGenericTable @ stub RtlGetElementGenericTable
@ stdcall RtlGetFullPathName_U(wstr long ptr ptr) @ stdcall RtlGetFullPathName_U(wstr long ptr ptr)
@ stdcall RtlGetGroupSecurityDescriptor(ptr ptr ptr) @ stdcall RtlGetGroupSecurityDescriptor(ptr ptr ptr)
@ stdcall RtlGetLastNtStatus()
@ stdcall RtlGetLastWin32Error() @ stdcall RtlGetLastWin32Error()
@ stdcall RtlGetLongestNtPathLength() @ stdcall RtlGetLongestNtPathLength()
@ stub RtlGetNtGlobalFlags @ stub RtlGetNtGlobalFlags
...@@ -579,6 +580,7 @@ ...@@ -579,6 +580,7 @@
@ stdcall RtlSetEnvironmentVariable(ptr ptr ptr) @ stdcall RtlSetEnvironmentVariable(ptr ptr ptr)
@ stdcall RtlSetGroupSecurityDescriptor(ptr ptr long) @ stdcall RtlSetGroupSecurityDescriptor(ptr ptr long)
@ stub RtlSetInformationAcl @ stub RtlSetInformationAcl
@ stdcall RtlSetLastWin32ErrorAndNtStatusFromNtStatus(long)
@ stdcall RtlSetLastWin32Error(long) @ stdcall RtlSetLastWin32Error(long)
@ stdcall RtlSetOwnerSecurityDescriptor(ptr ptr long) @ stdcall RtlSetOwnerSecurityDescriptor(ptr ptr long)
@ stdcall RtlSetSaclSecurityDescriptor(ptr long ptr long) @ stdcall RtlSetSaclSecurityDescriptor(ptr long ptr long)
......
...@@ -120,7 +120,8 @@ typedef struct _TEB ...@@ -120,7 +120,8 @@ typedef struct _TEB
/* here is plenty space for wine specific fields (don't forget to change pad6!!) */ /* here is plenty space for wine specific fields (don't forget to change pad6!!) */
/* the following are nt specific fields */ /* the following are nt specific fields */
DWORD pad6[624]; /* --n 238 */ DWORD pad6[623]; /* --n 238 */
ULONG LastStatusValue; /* -2- bf4 */
UNICODE_STRING StaticUnicodeString; /* -2- bf8 used by advapi32 */ UNICODE_STRING StaticUnicodeString; /* -2- bf8 used by advapi32 */
WCHAR StaticUnicodeBuffer[261]; /* -2- c00 used by advapi32 */ WCHAR StaticUnicodeBuffer[261]; /* -2- c00 used by advapi32 */
PVOID DeallocationStack; /* -2- e0c Base of the stack */ PVOID DeallocationStack; /* -2- e0c Base of the stack */
......
...@@ -225,7 +225,8 @@ typedef struct _TEB ...@@ -225,7 +225,8 @@ typedef struct _TEB
BYTE __pad038[140]; /* 038 */ BYTE __pad038[140]; /* 038 */
ULONG CurrentLocale; /* 0c4 */ ULONG CurrentLocale; /* 0c4 */
BYTE __pad0c8[1752]; /* 0c8 */ BYTE __pad0c8[1752]; /* 0c8 */
PVOID Reserved2[278]; /* 7a0 */ PVOID Reserved2[277]; /* 7a0 */
ULONG LastStatusValue; /* bf4 */
UNICODE_STRING StaticUnicodeString; /* bf8 used by advapi32 */ UNICODE_STRING StaticUnicodeString; /* bf8 used by advapi32 */
WCHAR StaticUnicodeBuffer[261]; /* c00 used by advapi32 */ WCHAR StaticUnicodeBuffer[261]; /* c00 used by advapi32 */
PVOID DeallocationStack; /* e0c */ PVOID DeallocationStack; /* e0c */
...@@ -1573,6 +1574,7 @@ NTSTATUS WINAPI RtlGetCurrentDirectory_U(ULONG, LPWSTR); ...@@ -1573,6 +1574,7 @@ NTSTATUS WINAPI RtlGetCurrentDirectory_U(ULONG, LPWSTR);
NTSTATUS WINAPI RtlGetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR,PBOOLEAN,PACL *,PBOOLEAN); NTSTATUS WINAPI RtlGetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR,PBOOLEAN,PACL *,PBOOLEAN);
ULONG WINAPI RtlGetFullPathName_U(PCWSTR,ULONG,PWSTR,PWSTR*); ULONG WINAPI RtlGetFullPathName_U(PCWSTR,ULONG,PWSTR,PWSTR*);
NTSTATUS WINAPI RtlGetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR,PSID *,PBOOLEAN); NTSTATUS WINAPI RtlGetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR,PSID *,PBOOLEAN);
NTSTATUS WINAPI RtlGetLastNtStatus(void);
DWORD WINAPI RtlGetLastWin32Error(void); DWORD WINAPI RtlGetLastWin32Error(void);
DWORD WINAPI RtlGetLongestNtPathLength(void); DWORD WINAPI RtlGetLongestNtPathLength(void);
BOOLEAN WINAPI RtlGetNtProductType(LPDWORD); BOOLEAN WINAPI RtlGetNtProductType(LPDWORD);
...@@ -1669,6 +1671,7 @@ NTSTATUS WINAPI RtlSetEnvironmentVariable(PWSTR*,PUNICODE_STRING,PUNICODE_STRIN ...@@ -1669,6 +1671,7 @@ NTSTATUS WINAPI RtlSetEnvironmentVariable(PWSTR*,PUNICODE_STRING,PUNICODE_STRIN
NTSTATUS WINAPI RtlSetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR,PSID,BOOLEAN); NTSTATUS WINAPI RtlSetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR,PSID,BOOLEAN);
NTSTATUS WINAPI RtlSetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR,PSID,BOOLEAN); NTSTATUS WINAPI RtlSetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR,PSID,BOOLEAN);
void WINAPI RtlSetLastWin32Error(DWORD); void WINAPI RtlSetLastWin32Error(DWORD);
void WINAPI RtlSetLastWin32ErrorAndNtStatusFromNtStatus(NTSTATUS);
NTSTATUS WINAPI RtlSetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR,BOOLEAN,PACL,BOOLEAN); NTSTATUS WINAPI RtlSetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR,BOOLEAN,PACL,BOOLEAN);
NTSTATUS WINAPI RtlSetTimeZoneInformation(const TIME_ZONE_INFORMATION*); NTSTATUS WINAPI RtlSetTimeZoneInformation(const TIME_ZONE_INFORMATION*);
ULONG WINAPI RtlSizeHeap(HANDLE,ULONG,PVOID); ULONG WINAPI RtlSizeHeap(HANDLE,ULONG,PVOID);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment