- Reimplement RtlLargeIntegerToChar (based on Wine code with my changes). It fixes all large_int Wine tests

svn path=/trunk/; revision=39622
This commit is contained in:
Dmitry Chapyshev 2009-02-16 12:07:27 +00:00
parent 7e91e42329
commit 79d5681478

View file

@ -1559,56 +1559,56 @@ RtlLargeIntegerToChar(
IN ULONG Length,
IN OUT PCHAR String)
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG Radix;
CHAR temp[65];
ULONGLONG v = Value->QuadPart;
ULONG i;
PCHAR tp;
PCHAR sp;
ULONGLONG Val = Value->QuadPart;
NTSTATUS Status = STATUS_SUCCESS;
CHAR Buffer[65];
CHAR Digit;
ULONG Len;
PCHAR Pos;
Radix = Base;
if (Radix == 0)
Radix = 10;
if (Base == 0) Base = 10;
if ((Radix != 2) && (Radix != 8) &&
(Radix != 10) && (Radix != 16))
return STATUS_INVALID_PARAMETER;
if ((Base != 2) && (Base != 8) &&
(Base != 10) && (Base != 16))
{
return STATUS_INVALID_PARAMETER;
}
tp = temp;
while (v || tp == temp)
{
i = v % Radix;
v = v / Radix;
if (i < 10)
*tp = i + '0';
else
*tp = i + 'A' - 10;
tp++;
}
Pos = &Buffer[64];
*Pos = '\0';
if ((ULONG)((ULONG_PTR)tp - (ULONG_PTR)temp) > Length)
return STATUS_BUFFER_OVERFLOW;
do
{
Pos--;
Digit = Val % Base;
Val = Val / Base;
if (Digit < 10)
*Pos = '0' + Digit;
else
*Pos = 'A' + Digit - 10;
}
while (Val != 0L);
//_SEH2_TRY
{
sp = String;
while (tp > temp)
*sp++ = *--tp;
Len = &Buffer[64] - Pos;
if((ULONG)((ULONG_PTR)sp - (ULONG_PTR)String) < Length)
*sp = 0;
}
#if 0
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
/* Get the error code */
Status = _SEH2_GetExceptionCode();
}
_SEH2_END;
#endif
if (Len > Length)
return STATUS_BUFFER_OVERFLOW;
return Status;
_SEH2_TRY
{
if (Len == Length)
RtlCopyMemory(String, Pos, Len);
else
RtlCopyMemory(String, Pos, Len + 1);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
/* Get the error code */
Status = _SEH2_GetExceptionCode();
}
_SEH2_END;
return Status;
}
/*