mirror of
https://github.com/reactos/reactos.git
synced 2024-07-31 00:28:56 +00:00
[NTDLL/RTL]: Implement RtlGet/SetThreadErrorMode.
[NTDLL/RTL]: Fix RtlIpv4AddressToStringA and RtlIpv4AddressToStringW to work like in Windows (and crash with a NULL buffer). svn path=/trunk/; revision=55729
This commit is contained in:
parent
9d05ce3297
commit
19a5d85926
|
@ -683,7 +683,7 @@
|
||||||
@ stdcall RtlGetSaclSecurityDescriptor(ptr ptr ptr ptr)
|
@ stdcall RtlGetSaclSecurityDescriptor(ptr ptr ptr ptr)
|
||||||
@ stdcall RtlGetSecurityDescriptorRMControl(ptr ptr)
|
@ stdcall RtlGetSecurityDescriptorRMControl(ptr ptr)
|
||||||
@ stdcall RtlGetSetBootStatusData(ptr long long ptr long long)
|
@ stdcall RtlGetSetBootStatusData(ptr long long ptr long long)
|
||||||
//@ stdcall RtlGetThreadErrorMode
|
@ stdcall RtlGetThreadErrorMode()
|
||||||
//@ stdcall RtlGetUnloadEventTrace
|
//@ stdcall RtlGetUnloadEventTrace
|
||||||
@ stdcall RtlGetUserInfoHeap(ptr long ptr ptr ptr)
|
@ stdcall RtlGetUserInfoHeap(ptr long ptr ptr ptr)
|
||||||
@ stdcall RtlGetVersion(ptr)
|
@ stdcall RtlGetVersion(ptr)
|
||||||
|
@ -894,7 +894,7 @@
|
||||||
@ stdcall RtlSetSecurityDescriptorRMControl(ptr ptr)
|
@ stdcall RtlSetSecurityDescriptorRMControl(ptr ptr)
|
||||||
@ stdcall RtlSetSecurityObject(long ptr ptr ptr ptr)
|
@ stdcall RtlSetSecurityObject(long ptr ptr ptr ptr)
|
||||||
//@ stdcall RtlSetSecurityObjectEx
|
//@ stdcall RtlSetSecurityObjectEx
|
||||||
//@ stdcall RtlSetThreadErrorMode
|
@ stdcall RtlSetThreadErrorMode(long ptr)
|
||||||
@ stdcall RtlSetThreadIsCritical(long ptr long)
|
@ stdcall RtlSetThreadIsCritical(long ptr long)
|
||||||
@ stdcall RtlSetThreadPoolStartFunc(ptr ptr)
|
@ stdcall RtlSetThreadPoolStartFunc(ptr ptr)
|
||||||
@ stdcall RtlSetTimeZoneInformation(ptr)
|
@ stdcall RtlSetTimeZoneInformation(ptr)
|
||||||
|
|
|
@ -681,7 +681,7 @@
|
||||||
@ stdcall RtlGetSaclSecurityDescriptor(ptr ptr ptr ptr)
|
@ stdcall RtlGetSaclSecurityDescriptor(ptr ptr ptr ptr)
|
||||||
@ stdcall RtlGetSecurityDescriptorRMControl(ptr ptr)
|
@ stdcall RtlGetSecurityDescriptorRMControl(ptr ptr)
|
||||||
@ stdcall RtlGetSetBootStatusData(ptr long long ptr long long)
|
@ stdcall RtlGetSetBootStatusData(ptr long long ptr long long)
|
||||||
;@ stdcall RtlGetThreadErrorMode
|
@ stdcall RtlGetThreadErrorMode()
|
||||||
;@ stdcall RtlGetUnloadEventTrace
|
;@ stdcall RtlGetUnloadEventTrace
|
||||||
@ stdcall RtlGetUserInfoHeap(ptr long ptr ptr ptr)
|
@ stdcall RtlGetUserInfoHeap(ptr long ptr ptr ptr)
|
||||||
@ stdcall RtlGetVersion(ptr)
|
@ stdcall RtlGetVersion(ptr)
|
||||||
|
@ -894,7 +894,7 @@
|
||||||
@ stdcall RtlSetSecurityDescriptorRMControl(ptr ptr)
|
@ stdcall RtlSetSecurityDescriptorRMControl(ptr ptr)
|
||||||
@ stdcall RtlSetSecurityObject(long ptr ptr ptr ptr)
|
@ stdcall RtlSetSecurityObject(long ptr ptr ptr ptr)
|
||||||
;@ stdcall RtlSetSecurityObjectEx
|
;@ stdcall RtlSetSecurityObjectEx
|
||||||
;@ stdcall RtlSetThreadErrorMode
|
@ stdcall RtlSetThreadErrorMode(long ptr)
|
||||||
@ stdcall RtlSetThreadIsCritical(long ptr long)
|
@ stdcall RtlSetThreadIsCritical(long ptr long)
|
||||||
@ stdcall RtlSetThreadPoolStartFunc(ptr ptr)
|
@ stdcall RtlSetThreadPoolStartFunc(ptr ptr)
|
||||||
@ stdcall RtlSetTimeZoneInformation(ptr)
|
@ stdcall RtlSetTimeZoneInformation(ptr)
|
||||||
|
|
|
@ -24,6 +24,10 @@
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
#define RTL_SEM_FAILCRITICALERRORS (SEM_FAILCRITICALERRORS << 4)
|
||||||
|
#define RTL_SEM_NOGPFAULTERRORBOX (SEM_NOGPFAULTERRORBOX << 4)
|
||||||
|
#define RTL_SEM_NOALIGNMENTFAULTEXCEPT (SEM_NOALIGNMENTFAULTEXCEPT << 4)
|
||||||
|
|
||||||
struct error_table
|
struct error_table
|
||||||
{
|
{
|
||||||
DWORD start;
|
DWORD start;
|
||||||
|
@ -171,6 +175,44 @@ RtlMapSecurityErrorToNtStatus(
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
RtlSetThreadErrorMode(IN ULONG NewMode,
|
||||||
|
OUT PULONG OldMode OPTIONAL)
|
||||||
|
{
|
||||||
|
PTEB Teb = NtCurrentTeb();
|
||||||
|
|
||||||
|
/* Ignore invalid error modes */
|
||||||
|
if (NewMode & ~(RTL_SEM_FAILCRITICALERRORS |
|
||||||
|
RTL_SEM_NOGPFAULTERRORBOX |
|
||||||
|
RTL_SEM_NOALIGNMENTFAULTEXCEPT))
|
||||||
|
{
|
||||||
|
DPRINT1("Invalid error mode\n");
|
||||||
|
return STATUS_INVALID_PARAMETER_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return old mode */
|
||||||
|
if (OldMode) *OldMode = Teb->HardErrorMode;
|
||||||
|
|
||||||
|
/* Set new one and return success */
|
||||||
|
Teb->HardErrorMode = NewMode;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
RtlGetThreadErrorMode(VOID)
|
||||||
|
{
|
||||||
|
/* Return it from the TEB */
|
||||||
|
return NtCurrentTeb()->HardErrorMode;
|
||||||
|
}
|
||||||
|
|
||||||
/* conversion tables */
|
/* conversion tables */
|
||||||
|
|
||||||
static const DWORD table_00000102[32] =
|
static const DWORD table_00000102[32] =
|
||||||
|
|
|
@ -31,18 +31,13 @@ NTAPI
|
||||||
RtlIpv4AddressToStringA(IN struct in_addr *Addr,
|
RtlIpv4AddressToStringA(IN struct in_addr *Addr,
|
||||||
OUT PCHAR S)
|
OUT PCHAR S)
|
||||||
{
|
{
|
||||||
CHAR Buffer[IPV4_ADDR_STRING_MAX_LEN];
|
|
||||||
INT Length;
|
INT Length;
|
||||||
|
|
||||||
if(!S)
|
Length = sprintf(S, "%u.%u.%u.%u", Addr->S_un.S_un_b.s_b1,
|
||||||
return NULL;
|
|
||||||
|
|
||||||
Length = sprintf(Buffer, "%u.%u.%u.%u", Addr->S_un.S_un_b.s_b1,
|
|
||||||
Addr->S_un.S_un_b.s_b2,
|
Addr->S_un.S_un_b.s_b2,
|
||||||
Addr->S_un.S_un_b.s_b3,
|
Addr->S_un.S_un_b.s_b3,
|
||||||
Addr->S_un.S_un_b.s_b4);
|
Addr->S_un.S_un_b.s_b4);
|
||||||
|
|
||||||
strcpy(S, Buffer);
|
|
||||||
return S + Length;
|
return S + Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,19 +83,12 @@ NTAPI
|
||||||
RtlIpv4AddressToStringW(IN struct in_addr *Addr,
|
RtlIpv4AddressToStringW(IN struct in_addr *Addr,
|
||||||
OUT PWCHAR S)
|
OUT PWCHAR S)
|
||||||
{
|
{
|
||||||
WCHAR Buffer[IPV4_ADDR_STRING_MAX_LEN];
|
|
||||||
INT Length;
|
INT Length;
|
||||||
|
|
||||||
if (!S)
|
Length = swprintf(S, L"%u.%u.%u.%u", Addr->S_un.S_un_b.s_b1,
|
||||||
return NULL;
|
Addr->S_un.S_un_b.s_b2,
|
||||||
|
Addr->S_un.S_un_b.s_b3,
|
||||||
Length = swprintf(Buffer, L"%u.%u.%u.%u", Addr->S_un.S_un_b.s_b1,
|
Addr->S_un.S_un_b.s_b4);
|
||||||
Addr->S_un.S_un_b.s_b2,
|
|
||||||
Addr->S_un.S_un_b.s_b3,
|
|
||||||
Addr->S_un.S_un_b.s_b4);
|
|
||||||
|
|
||||||
wcscpy(S, Buffer);
|
|
||||||
|
|
||||||
return S + Length;
|
return S + Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue