[KERNEL32]: Add ConvertOpenWin32AnsiObjectApiToUnicodeApi macro.

[KERNEL32]: Fix bugs #11, #12, #13: OpenJobObjectA did not correctly set the error code in case the string was too long, nor did it use the TEB's static unicode cache, nor did it enforce a 260 character object name limit. Fixed by using the new macro.

svn path=/trunk/; revision=52789
This commit is contained in:
Alex Ionescu 2011-07-23 09:28:15 +00:00
parent 5496adb4bc
commit d06e82af03
2 changed files with 13 additions and 25 deletions

View file

@ -92,31 +92,8 @@ OpenJobObjectA(DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCSTR lpName)
{
ANSI_STRING AnsiName;
UNICODE_STRING UnicodeName;
HANDLE hJob;
NTSTATUS Status;
if (lpName == NULL)
{
SetLastError(ERROR_INVALID_PARAMETER);
return NULL;
}
RtlInitAnsiString(&AnsiName, lpName);
Status = RtlAnsiStringToUnicodeString(&UnicodeName, &AnsiName, TRUE);
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
return FALSE;
}
hJob = OpenJobObjectW(dwDesiredAccess,
bInheritHandle,
UnicodeName.Buffer);
RtlFreeUnicodeString(&UnicodeName);
return hJob;
/* Call the W(ide) function */
ConvertOpenWin32AnsiObjectApiToUnicodeApi(JobObject, dwDesiredAccess, bInheritHandle, lpName);
}

View file

@ -68,6 +68,17 @@
if (NT_SUCCESS(Status)) return obj##W(UnicodeCache->Buffer, ##__VA_ARGS__); \
ConvertAnsiToUnicodeEpilogue
//
// This macro uses the ConvertAnsiToUnicode macros above to convert a OpenXxxA
// Win32 API into its equivalent OpenXxxW API.
//
#define ConvertOpenWin32AnsiObjectApiToUnicodeApi(obj, acc, inh, name) \
ConvertAnsiToUnicodePrologue \
if (!name) SetLastError(ERROR_INVALID_PARAMETER); return NULL; \
ConvertAnsiToUnicodeBody(name) \
if (NT_SUCCESS(Status)) return Open##obj##W(acc, inh, UnicodeCache->Buffer);\
ConvertAnsiToUnicodeEpilogue
//
// This macro (split it up in 3 pieces to allow for intermediary code in between)
// wraps the usual code path required to create an NT object based on a Unicode