- 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:
Rafal Harabien 2011-09-08 14:13:19 +00:00
parent 2225b4b938
commit e0d36fe09a

View file

@ -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)))
{ {
EngSetLastError(ERROR_INVALID_ACCEL_HANDLE);
RETURN(0); 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].fVirt = Accel->Table[Ret].fVirt & 0x7f;
Entries[Ret].key = Accel->Table[Ret].key; Entries[Ret].key = Accel->Table[Ret].key;
Entries[Ret].cmd = Accel->Table[Ret].cmd; 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,8 +372,6 @@ NtUserCreateAcceleratorTable(
} }
Accel->Count = EntriesCount; Accel->Count = EntriesCount;
if (Accel->Count > 0)
{
Accel->Table = ExAllocatePoolWithTag(PagedPool, EntriesCount * sizeof(ACCEL), USERTAG_ACCEL); Accel->Table = ExAllocatePoolWithTag(PagedPool, EntriesCount * sizeof(ACCEL), USERTAG_ACCEL);
if (Accel->Table == NULL) if (Accel->Table == NULL)
{ {
@ -392,7 +387,7 @@ NtUserCreateAcceleratorTable(
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;
@ -424,10 +419,6 @@ NtUserCreateAcceleratorTable(
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 */
RETURN(hAccel); RETURN(hAccel);
@ -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);