mirror of
https://github.com/reactos/reactos.git
synced 2025-04-17 19:27:00 +00:00
[WIN32K]
- Simplify accelerators code a bit - Set last error in NtUserCopyAcceleratorTable - Fix user32:resource winetest regression svn path=/trunk/; revision=53642
This commit is contained in:
parent
2225b4b938
commit
e0d36fe09a
1 changed files with 55 additions and 68 deletions
|
@ -291,19 +291,25 @@ NtUserCopyAcceleratorTable(
|
||||||
{
|
{
|
||||||
PACCELERATOR_TABLE Accel;
|
PACCELERATOR_TABLE Accel;
|
||||||
int Ret;
|
int Ret;
|
||||||
BOOL Done = FALSE;
|
|
||||||
DECLARE_RETURN(int);
|
DECLARE_RETURN(int);
|
||||||
|
|
||||||
TRACE("Enter NtUserCopyAcceleratorTable\n");
|
TRACE("Enter NtUserCopyAcceleratorTable\n");
|
||||||
UserEnterShared();
|
UserEnterShared();
|
||||||
|
|
||||||
Accel = UserGetAccelObject(hAccel);
|
Accel = UserGetAccelObject(hAccel);
|
||||||
|
if (!Accel)
|
||||||
if ((Entries && (EntriesCount < 1)) || ((hAccel == NULL) || (!Accel)))
|
|
||||||
{
|
{
|
||||||
RETURN(0);
|
EngSetLastError(ERROR_INVALID_ACCEL_HANDLE);
|
||||||
|
RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If Entries is NULL return table size */
|
||||||
|
if (!Entries)
|
||||||
|
{
|
||||||
|
RETURN(Accel->Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Don't overrun */
|
||||||
if (Accel->Count < EntriesCount)
|
if (Accel->Count < EntriesCount)
|
||||||
EntriesCount = Accel->Count;
|
EntriesCount = Accel->Count;
|
||||||
|
|
||||||
|
@ -313,20 +319,11 @@ NtUserCopyAcceleratorTable(
|
||||||
{
|
{
|
||||||
ProbeForWrite(Entries, EntriesCount*sizeof(Entries[0]), 4);
|
ProbeForWrite(Entries, EntriesCount*sizeof(Entries[0]), 4);
|
||||||
|
|
||||||
while (!Done)
|
for (Ret = 0; Ret < EntriesCount; Ret++)
|
||||||
{
|
{
|
||||||
if (Entries)
|
Entries[Ret].fVirt = Accel->Table[Ret].fVirt;
|
||||||
{
|
Entries[Ret].key = Accel->Table[Ret].key;
|
||||||
Entries[Ret].fVirt = Accel->Table[Ret].fVirt & 0x7f;
|
Entries[Ret].cmd = Accel->Table[Ret].cmd;
|
||||||
Entries[Ret].key = Accel->Table[Ret].key;
|
|
||||||
Entries[Ret].cmd = Accel->Table[Ret].cmd;
|
|
||||||
|
|
||||||
if(Ret + 1 == EntriesCount) Done = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if((Accel->Table[Ret].fVirt & 0x80) != 0) Done = TRUE;
|
|
||||||
|
|
||||||
Ret++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
@ -360,7 +357,7 @@ NtUserCreateAcceleratorTable(
|
||||||
Entries, EntriesCount);
|
Entries, EntriesCount);
|
||||||
UserEnterExclusive();
|
UserEnterExclusive();
|
||||||
|
|
||||||
if (!Entries || EntriesCount < 1)
|
if (!Entries || EntriesCount <= 0)
|
||||||
{
|
{
|
||||||
SetLastNtError(STATUS_INVALID_PARAMETER);
|
SetLastNtError(STATUS_INVALID_PARAMETER);
|
||||||
RETURN( (HACCEL) NULL );
|
RETURN( (HACCEL) NULL );
|
||||||
|
@ -375,57 +372,51 @@ NtUserCreateAcceleratorTable(
|
||||||
}
|
}
|
||||||
|
|
||||||
Accel->Count = EntriesCount;
|
Accel->Count = EntriesCount;
|
||||||
if (Accel->Count > 0)
|
Accel->Table = ExAllocatePoolWithTag(PagedPool, EntriesCount * sizeof(ACCEL), USERTAG_ACCEL);
|
||||||
|
if (Accel->Table == NULL)
|
||||||
{
|
{
|
||||||
Accel->Table = ExAllocatePoolWithTag(PagedPool, EntriesCount * sizeof(ACCEL), USERTAG_ACCEL);
|
UserDereferenceObject(Accel);
|
||||||
if (Accel->Table == NULL)
|
UserDeleteObject(hAccel, otAccel);
|
||||||
{
|
SetLastNtError(STATUS_NO_MEMORY);
|
||||||
UserDereferenceObject(Accel);
|
RETURN( (HACCEL) NULL);
|
||||||
UserDeleteObject(hAccel, otAccel);
|
}
|
||||||
SetLastNtError(STATUS_NO_MEMORY);
|
|
||||||
RETURN( (HACCEL) NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
ProbeForRead(Entries, EntriesCount * sizeof(ACCEL), 4);
|
ProbeForRead(Entries, EntriesCount * sizeof(ACCEL), 4);
|
||||||
|
|
||||||
for (Index = 0; Index < EntriesCount; Index++)
|
for (Index = 0; Index < EntriesCount; Index++)
|
||||||
{
|
{
|
||||||
Accel->Table[Index].fVirt = Entries[Index].fVirt&0x7f;
|
Accel->Table[Index].fVirt = Entries[Index].fVirt & 0x7F;
|
||||||
if(Accel->Table[Index].fVirt & FVIRTKEY)
|
if(Accel->Table[Index].fVirt & FVIRTKEY)
|
||||||
{
|
{
|
||||||
Accel->Table[Index].key = Entries[Index].key;
|
Accel->Table[Index].key = Entries[Index].key;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RtlMultiByteToUnicodeN(&Accel->Table[Index].key,
|
RtlMultiByteToUnicodeN(&Accel->Table[Index].key,
|
||||||
sizeof(WCHAR),
|
sizeof(WCHAR),
|
||||||
NULL,
|
NULL,
|
||||||
(PCSTR)&Entries[Index].key,
|
(PCSTR)&Entries[Index].key,
|
||||||
sizeof(CHAR));
|
sizeof(CHAR));
|
||||||
}
|
}
|
||||||
|
|
||||||
Accel->Table[Index].cmd = Entries[Index].cmd;
|
Accel->Table[Index].cmd = Entries[Index].cmd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
Status = _SEH2_GetExceptionCode();
|
Status = _SEH2_GetExceptionCode();
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
ExFreePoolWithTag(Accel->Table, USERTAG_ACCEL);
|
ExFreePoolWithTag(Accel->Table, USERTAG_ACCEL);
|
||||||
UserDereferenceObject(Accel);
|
UserDereferenceObject(Accel);
|
||||||
UserDeleteObject(hAccel, otAccel);
|
UserDeleteObject(hAccel, otAccel);
|
||||||
SetLastNtError(Status);
|
SetLastNtError(Status);
|
||||||
RETURN( (HACCEL) NULL);
|
RETURN( (HACCEL) NULL);
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the end-of-table terminator. */
|
|
||||||
Accel->Table[EntriesCount - 1].fVirt |= 0x80;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: Save HandleTable in a list somewhere so we can clean it up again */
|
/* FIXME: Save HandleTable in a list somewhere so we can clean it up again */
|
||||||
|
@ -546,10 +537,6 @@ NtUserTranslateAccelerator(
|
||||||
hWnd, hAccel, pUnsafeMessage, 1);
|
hWnd, hAccel, pUnsafeMessage, 1);
|
||||||
RETURN( 1);
|
RETURN( 1);
|
||||||
}
|
}
|
||||||
if (((Accel->Table[i].fVirt & 0x80) > 0))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RETURN( 0);
|
RETURN( 0);
|
||||||
|
|
Loading…
Reference in a new issue