- 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)))
{ {
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);