Author: tkreuzer
Date: Wed Aug 1 23:52:43 2012
New Revision: 57023
URL:
http://svn.reactos.org/svn/reactos?rev=57023&view=rev
Log:
[WIN32K]
- Implement CaptureUnicodeStringOrAtom, which handles user mode class names or atoms, and
use it in some places.
- Fix a number of format strings
Modified:
trunk/reactos/win32ss/user/ntuser/class.c
trunk/reactos/win32ss/user/ntuser/class.h
Modified: trunk/reactos/win32ss/user/ntuser/class.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/class.…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/class.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/class.c [iso-8859-1] Wed Aug 1 23:52:43 2012
@@ -110,6 +110,72 @@
return FALSE;
}
+_Must_inspect_result_
+NTSTATUS
+NTAPI
+CaptureUnicodeStringOrAtom(
+ _Out_ PUNICODE_STRING pustrOut,
+ __in_data_source(USER_MODE) _In_ PUNICODE_STRING pustrUnsafe)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ /* Default to NULL */
+ pustrOut->Buffer = NULL;
+
+ _SEH2_TRY
+ {
+ ProbeForRead(pustrUnsafe, sizeof(UNICODE_STRING), 1);
+
+ /* Validate the string */
+ if ((pustrUnsafe->Length & 1) || (pustrUnsafe->Buffer == NULL))
+ {
+ /* This is not legal */
+ _SEH2_YIELD(return STATUS_INVALID_PARAMETER);
+ }
+
+ /* Check if this is an atom */
+ if (IS_ATOM(pustrUnsafe->Buffer))
+ {
+ /* Copy the atom, length is 0 */
+ pustrOut->MaximumLength = pustrOut->Length = 0;
+ pustrOut->Buffer = pustrUnsafe->Buffer;
+ }
+ else
+ {
+ /* Get the length, maximum length includes zero termination */
+ pustrOut->Length = pustrUnsafe->Length;
+ pustrOut->MaximumLength = pustrOut->Length + sizeof(WCHAR);
+
+ /* Allocate a buffer */
+ pustrOut->Buffer = ExAllocatePoolWithTag(PagedPool,
+ pustrOut->MaximumLength,
+ TAG_STRING);
+ if (!pustrOut->Buffer)
+ {
+ _SEH2_YIELD(return STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ /* Copy the string and zero terminate it */
+ ProbeForRead(pustrUnsafe->Buffer, pustrOut->Length, 1);
+ RtlCopyMemory(pustrOut->Buffer, pustrUnsafe->Buffer,
pustrOut->Length);
+ pustrOut->Buffer[pustrOut->Length / sizeof(WCHAR)] = L'\0';
+ }
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ /* Check if we already allocated a buffer */
+ if (pustrOut->Buffer)
+ {
+ /* Free the buffer */
+ ExFreePoolWithTag(pustrOut->Buffer, TAG_STRING);
+ Status = _SEH2_GetExceptionCode();
+ }
+ }
+ _SEH2_END;
+
+ return Status;
+}
+
/* WINDOWCLASS ***************************************************************/
static VOID
@@ -503,7 +569,7 @@
/* Simply clone the class */
RtlCopyMemory( Class, BaseClass, ClassSize);
- TRACE("Clone Class 0x%x hM 0x%x\n %S\n",Class, Class->hModule,
Class->lpszClientUnicodeMenuName);
+ TRACE("Clone Class 0x%p hM 0x%p\n %S\n",Class, Class->hModule,
Class->lpszClientUnicodeMenuName);
/* Restore module address if default user class Ref: Bug 4778 */
if ( Class->hModule != hModClient &&
@@ -511,7 +577,7 @@
Class->fnid >= FNID_BUTTON )
{
Class->hModule = hModClient;
- TRACE("Clone Class 0x%x Reset hM 0x%x\n",Class,
Class->hModule);
+ TRACE("Clone Class 0x%p Reset hM 0x%p\n",Class,
Class->hModule);
}
/* Update some pointers and link the class */
@@ -631,7 +697,7 @@
{
ASSERT(Class->pclsBase == Class);
- TRACE("IntDereferenceClass 0x%x\n", Class);
+ TRACE("IntDereferenceClass 0x%p\n", Class);
/* Check if there are clones of the class on other desktops,
link the first clone in if possible. If there are no clones
then leave the class on the desktop heap. It will get moved
@@ -669,7 +735,7 @@
}
else
{
- TRACE("IntDereferenceClass1 0x%x\n", Class);
+ TRACE("IntDereferenceClass1 0x%p\n", Class);
/* Locate the cloned class and unlink it */
PrevLink = &BaseClass->pclsClone;
@@ -1032,7 +1098,7 @@
EngSetLastError(ERROR_NOT_ENOUGH_MEMORY);
}
- TRACE("Created class 0x%x with name %wZ and proc 0x%x for atom 0x%x and
hInstance 0x%x, global %d\n",
+ TRACE("Created class 0x%p with name %wZ and proc 0x%p for atom 0x%x and
hInstance 0x%p, global %u\n",
Class, ClassName, Class->lpfnWndProc, Atom, Class->hModule,
Class->Global);
return Class;
@@ -1068,8 +1134,10 @@
}
BOOL
-IntGetAtomFromStringOrAtom(IN PUNICODE_STRING ClassName,
- OUT RTL_ATOM *Atom)
+NTAPI
+IntGetAtomFromStringOrAtom(
+ _In_ PUNICODE_STRING ClassName,
+ _Out_ RTL_ATOM *Atom)
{
BOOL Ret = FALSE;
@@ -1078,6 +1146,8 @@
WCHAR szBuf[65];
PWSTR AtomName;
NTSTATUS Status;
+
+ *Atom = 0;
/* NOTE: Caller has to protect the call with SEH! */
@@ -1134,11 +1204,12 @@
}
RTL_ATOM
-IntGetClassAtom(IN PUNICODE_STRING ClassName,
- IN HINSTANCE hInstance OPTIONAL,
- IN PPROCESSINFO pi OPTIONAL,
- OUT PCLS *BaseClass OPTIONAL,
- OUT PCLS **Link OPTIONAL)
+IntGetClassAtom(
+ _In_ PUNICODE_STRING ClassName,
+ IN HINSTANCE hInstance OPTIONAL,
+ IN PPROCESSINFO pi OPTIONAL,
+ OUT PCLS *BaseClass OPTIONAL,
+ OUT PCLS **Link OPTIONAL)
{
RTL_ATOM Atom = (RTL_ATOM)0;
@@ -1160,7 +1231,7 @@
&pi->pclsPrivateList,
Link);
if (Class != NULL)
- { TRACE("Step 1: 0x%x\n",Class );
+ { TRACE("Step 1: 0x%p\n",Class );
goto FoundClass;
}
@@ -1171,7 +1242,7 @@
&pi->pclsPublicList,
Link);
if (Class != NULL)
- { TRACE("Step 2: 0x%x 0x%x\n",Class, Class->hModule);
+ { TRACE("Step 2: 0x%p 0x%p\n",Class, Class->hModule);
goto FoundClass;
}
@@ -1181,7 +1252,7 @@
&pi->pclsPrivateList,
Link);
if (Class != NULL)
- { TRACE("Step 3: 0x%x\n",Class );
+ { TRACE("Step 3: 0x%p\n",Class );
goto FoundClass;
}
@@ -1194,7 +1265,7 @@
{
EngSetLastError(ERROR_CLASS_DOES_NOT_EXIST);
return (RTL_ATOM)0;
- }else{TRACE("Step 4: 0x%x\n",Class );}
+ }else{TRACE("Step 4: 0x%p\n",Class );}
FoundClass:
*BaseClass = Class;
@@ -1219,7 +1290,7 @@
/* Check the class. */
- TRACE("Finding Class %wZ for hInstance 0x%x\n", ClassName, hInstance);
+ TRACE("Finding Class %wZ for hInstance 0x%p\n", ClassName, hInstance);
ClassAtom = IntGetClassAtom(ClassName,
hInstance,
@@ -1231,7 +1302,7 @@
{
if (IS_ATOM(ClassName->Buffer))
{
- ERR("Class 0x%p not found\n", (DWORD_PTR) ClassName->Buffer);
+ ERR("Class 0x%p not found\n", ClassName->Buffer);
}
else
{
@@ -1242,7 +1313,7 @@
return NULL;
}
- TRACE("Referencing Class 0x%x with atom 0x%x\n", Class, ClassAtom);
+ TRACE("Referencing Class 0x%p with atom 0x%x\n", Class, ClassAtom);
Class = IntReferenceClass(Class,
ClassLink,
pti->rpdesk);
@@ -1287,7 +1358,7 @@
if (Class != NULL && !Class->Global)
{
// Local class already exists
- TRACE("Local Class 0x%p does already exist!\n", ClassAtom);
+ TRACE("Local Class 0x%x does already exist!\n", ClassAtom);
EngSetLastError(ERROR_CLASS_ALREADY_EXISTS);
return (RTL_ATOM)0;
}
@@ -1301,7 +1372,7 @@
if (Class != NULL && Class->Global)
{
- TRACE("Global Class 0x%p does already exist!\n", ClassAtom);
+ TRACE("Global Class 0x%x does already exist!\n", ClassAtom);
EngSetLastError(ERROR_CLASS_ALREADY_EXISTS);
return (RTL_ATOM)0;
}
@@ -1352,7 +1423,7 @@
pi = GetW32ProcessInfo();
- TRACE("UserUnregisterClass(%wZ, 0x%x)\n", ClassName, hInstance);
+ TRACE("UserUnregisterClass(%wZ, 0x%p)\n", ClassName, hInstance);
/* NOTE: Accessing the buffer in ClassName may raise an exception! */
ClassAtom = IntGetClassAtom(ClassName,
@@ -1371,7 +1442,7 @@
if (Class->cWndReferenceCount != 0 ||
Class->pclsClone != NULL)
{
- TRACE("UserUnregisterClass: Class has a Window. Ct %d : Clone 0x%x\n",
Class->cWndReferenceCount, Class->pclsClone);
+ TRACE("UserUnregisterClass: Class has a Window. Ct %u : Clone 0x%p\n",
Class->cWndReferenceCount, Class->pclsClone);
EngSetLastError(ERROR_CLASS_HAS_WINDOWS);
return FALSE;
}
@@ -1384,7 +1455,7 @@
if (NT_SUCCESS(IntDeregisterClassAtom(Class->atomClassName)))
{
- TRACE("Class 0x%x\n", Class);
+ TRACE("Class 0x%p\n", Class);
TRACE("UserUnregisterClass: Good Exit!\n");
/* Finally free the resources */
IntDestroyClass(Class);
@@ -2184,196 +2255,135 @@
return(0);
}
-BOOL APIENTRY
-NtUserUnregisterClass(IN PUNICODE_STRING ClassNameOrAtom,
- IN HINSTANCE hInstance,
- OUT PCLSMENUNAME pClassMenuName)
-{
- UNICODE_STRING CapturedClassName;
- BOOL Ret = FALSE;
+BOOL
+APIENTRY
+NtUserUnregisterClass(
+ IN PUNICODE_STRING ClassNameOrAtom,
+ IN HINSTANCE hInstance,
+ OUT PCLSMENUNAME pClassMenuName)
+{
+ UNICODE_STRING SafeClassName;
+ NTSTATUS Status;
+ BOOL Ret;
+
+ Status = CaptureUnicodeStringOrAtom(&SafeClassName, ClassNameOrAtom);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("Error capturing the class name\n");
+ SetLastNtError(Status);
+ return FALSE;
+ }
UserEnterExclusive();
- _SEH2_TRY
- {
- /* Probe the paramters */
- CapturedClassName = ProbeForReadUnicodeString(ClassNameOrAtom);
- if (CapturedClassName.Length & 1)
- {
- goto InvalidParameter;
- }
-
- if (CapturedClassName.Length != 0)
- {
- ProbeForRead(CapturedClassName.Buffer,
- CapturedClassName.Length,
- sizeof(WCHAR));
- }
- else
- {
- if (!IS_ATOM(CapturedClassName.Buffer))
- {
-InvalidParameter:
- EngSetLastError(ERROR_INVALID_PARAMETER);
- _SEH2_LEAVE;
- }
- }
-
- /* Unregister the class */
- Ret = UserUnregisterClass(&CapturedClassName,
- hInstance,
- NULL); // Null for now~
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- SetLastNtError(_SEH2_GetExceptionCode());
- }
- _SEH2_END;
+ /* Unregister the class */
+ Ret = UserUnregisterClass(&SafeClassName, hInstance, NULL); // Null for now~
UserLeave();
+
+ if (SafeClassName.Buffer && !IS_ATOM(SafeClassName.Buffer))
+ ExFreePoolWithTag(SafeClassName.Buffer, TAG_STRING);
+
return Ret;
}
+
/* NOTE: For system classes hInstance is not NULL here, but User32Instance */
-BOOL APIENTRY
+BOOL
+APIENTRY
NtUserGetClassInfo(
HINSTANCE hInstance,
PUNICODE_STRING ClassName,
LPWNDCLASSEXW lpWndClassEx,
LPWSTR *ppszMenuName,
- BOOL Ansi)
-{
- UNICODE_STRING CapturedClassName, SafeClassName;
- WNDCLASSEXW Safewcexw;
- PCLS Class;
- RTL_ATOM ClassAtom = 0;
- PPROCESSINFO ppi;
- BOOL Ret = TRUE;
-
- /* NOTE: Need exclusive lock because getting the wndproc might require the
- creation of a call procedure handle */
- UserEnterExclusive();
-
- ppi = GetW32ProcessInfo();
-
- if ( !(ppi->W32PF_flags & W32PF_CLASSESREGISTERED ))
- {
- UserRegisterSystemClasses();
- }
-
- _SEH2_TRY
- {
- /* Probe the paramters */
- CapturedClassName = ProbeForReadUnicodeString(ClassName);
-
- if (CapturedClassName.Length == 0)
- {
- TRACE("hInst %p atom %04X lpWndClassEx %p Ansi %d\n", hInstance,
CapturedClassName.Buffer, lpWndClassEx, Ansi);
- }
- else
- {
- TRACE("hInst %p class %wZ lpWndClassEx %p Ansi %d\n", hInstance,
&CapturedClassName, lpWndClassEx, Ansi);
- }
-
- if (CapturedClassName.Length & 1)
- {
- EngSetLastError(ERROR_INVALID_PARAMETER);
- Ret = FALSE;
- _SEH2_LEAVE;
- }
-
- if (CapturedClassName.Length != 0)
- {
- ProbeForRead( CapturedClassName.Buffer,
- CapturedClassName.Length,
- sizeof(WCHAR));
-
- RtlInitUnicodeString( &SafeClassName, CapturedClassName.Buffer);
-
- SafeClassName.Buffer = ExAllocatePoolWithTag( PagedPool,
- SafeClassName.MaximumLength,
- TAG_STRING);
- RtlCopyMemory( SafeClassName.Buffer,
- CapturedClassName.Buffer,
- SafeClassName.MaximumLength);
- }
- else
- {
- if (!IS_ATOM(CapturedClassName.Buffer))
- {
- ERR("NtUserGetClassInfo() got ClassName instead of Atom!\n");
- EngSetLastError(ERROR_INVALID_PARAMETER);
+ BOOL bAnsi)
+{
+ UNICODE_STRING SafeClassName;
+ WNDCLASSEXW Safewcexw;
+ PCLS Class;
+ RTL_ATOM ClassAtom = 0;
+ PPROCESSINFO ppi;
+ BOOL Ret = TRUE;
+ NTSTATUS Status;
+
+ _SEH2_TRY
+ {
+ ProbeForWrite( lpWndClassEx, sizeof(WNDCLASSEXW), sizeof(ULONG));
+ RtlCopyMemory( &Safewcexw, lpWndClassEx, sizeof(WNDCLASSEXW));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ SetLastNtError(_SEH2_GetExceptionCode());
+ _SEH2_YIELD(return FALSE);
+ }
+ _SEH2_END;
+
+ Status = CaptureUnicodeStringOrAtom(&SafeClassName, ClassName);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("Error capturing the class name\n");
+ SetLastNtError(Status);
+ return FALSE;
+ }
+
+ // If null instance use client.
+ if (!hInstance) hInstance = hModClient;
+
+ TRACE("GetClassInfo(%wZ, 0x%x)\n", SafeClassName, hInstance);
+
+ /* NOTE: Need exclusive lock because getting the wndproc might require the
+ creation of a call procedure handle */
+ UserEnterExclusive();
+
+ ppi = GetW32ProcessInfo();
+ if (!(ppi->W32PF_flags & W32PF_CLASSESREGISTERED))
+ {
+ UserRegisterSystemClasses();
+ }
+
+ ClassAtom = IntGetClassAtom(&SafeClassName,
+ hInstance,
+ ppi,
+ &Class,
+ NULL);
+ if (ClassAtom != (RTL_ATOM)0)
+ {
+ Ret = UserGetClassInfo(Class, &Safewcexw, bAnsi, hInstance);
+ }
+ else
+ {
+ EngSetLastError(ERROR_CLASS_DOES_NOT_EXIST);
+ Ret = FALSE;
+ }
+
+ UserLeave();
+
+ if (Ret)
+ {
+ _SEH2_TRY
+ {
+ /* Emulate Function. */
+ if (ppszMenuName) *ppszMenuName = (LPWSTR)Safewcexw.lpszMenuName;
+
+ RtlCopyMemory(lpWndClassEx, &Safewcexw, sizeof(WNDCLASSEXW));
+
+ // From Wine:
+ /* We must return the atom of the class here instead of just TRUE. */
+ /* Undocumented behavior! Return the class atom as a BOOL! */
+ Ret = (BOOL)ClassAtom;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ EngSetLastError(ERROR_CLASS_DOES_NOT_EXIST);
Ret = FALSE;
- _SEH2_LEAVE;
- }
-
- SafeClassName.Buffer = CapturedClassName.Buffer;
- SafeClassName.Length = 0;
- SafeClassName.MaximumLength = 0;
- }
-
- ProbeForWrite( lpWndClassEx, sizeof(WNDCLASSEXW), sizeof(ULONG));
-
- RtlCopyMemory( &Safewcexw, lpWndClassEx, sizeof(WNDCLASSEXW));
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- SetLastNtError(_SEH2_GetExceptionCode());
- Ret = FALSE;
- }
- _SEH2_END;
-
- // If null instance use client.
- if (!hInstance) hInstance = hModClient;
-
- if (Ret)
- {
- TRACE("GetClassInfo(%wZ, 0x%x)\n", SafeClassName, hInstance);
- ClassAtom = IntGetClassAtom( &SafeClassName,
- hInstance,
- ppi,
- &Class,
- NULL);
- if (ClassAtom != (RTL_ATOM)0)
- {
- if (hInstance == NULL) hInstance = hModClient;
-
- Ret = UserGetClassInfo( Class,
- &Safewcexw,
- Ansi,
- hInstance);
- }
- else
- {
- EngSetLastError(ERROR_CLASS_DOES_NOT_EXIST);
- Ret = FALSE;
- }
- }
- _SEH2_TRY
- {
- if (Ret)
- {
- /* Emulate Function. */
- if (ppszMenuName) *ppszMenuName = (LPWSTR)Safewcexw.lpszMenuName;
-
- RtlCopyMemory(lpWndClassEx, &Safewcexw, sizeof(WNDCLASSEXW));
-
- // From Wine:
- /* We must return the atom of the class here instead of just TRUE. */
- /* Undocumented behavior! Return the class atom as a BOOL! */
- Ret = (BOOL)ClassAtom;
- }
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- EngSetLastError(ERROR_CLASS_DOES_NOT_EXIST);
- Ret = FALSE;
- }
- _SEH2_END;
-
- if (SafeClassName.Length) ExFreePoolWithTag(SafeClassName.Buffer, TAG_STRING);
- UserLeave();
- return Ret;
+ }
+ _SEH2_END;
+ }
+
+ if (!IS_ATOM(SafeClassName.Buffer))
+ ExFreePoolWithTag(SafeClassName.Buffer, TAG_STRING);
+
+ return Ret;
}
@@ -2430,78 +2440,49 @@
}
/* Return Pointer to Class structure. */
-PCLS APIENTRY
-NtUserGetWOWClass(HINSTANCE hInstance,
- PUNICODE_STRING ClassName)
-{
- UNICODE_STRING SafeClassName;
- PPROCESSINFO pi;
- PCLS Class = NULL;
- RTL_ATOM ClassAtom = 0;
- BOOL Hit = FALSE;
-
- UserEnterExclusive();
-
- pi = GetW32ProcessInfo();
-
- _SEH2_TRY
- {
- if (ClassName->Length != 0)
- {
- ProbeForRead( ClassName->Buffer,
- ClassName->Length,
- sizeof(WCHAR));
-
- RtlInitUnicodeString( &SafeClassName, ClassName->Buffer);
-
- SafeClassName.Buffer = ExAllocatePoolWithTag( PagedPool,
- SafeClassName.MaximumLength,
- TAG_STRING);
- RtlCopyMemory( SafeClassName.Buffer,
- ClassName->Buffer,
- SafeClassName.MaximumLength);
- }
- else
- {
- if (!IS_ATOM(ClassName->Buffer))
- {
- ERR("NtUserGetWOWClass() got ClassName instead of Atom!\n");
- Hit = TRUE;
- }
- else
- {
- SafeClassName.Buffer = ClassName->Buffer;
- SafeClassName.Length = 0;
- SafeClassName.MaximumLength = 0;
- }
- }
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- EngSetLastError(ERROR_CLASS_DOES_NOT_EXIST);
- Hit = TRUE;
- }
- _SEH2_END;
-
- if (!Hit)
- {
- ClassAtom = IntGetClassAtom( &SafeClassName,
- hInstance,
- pi,
- &Class,
- NULL);
- if (!ClassAtom)
- {
+PCLS
+APIENTRY
+NtUserGetWOWClass(
+ HINSTANCE hInstance,
+ PUNICODE_STRING ClassName)
+{
+ UNICODE_STRING SafeClassName;
+ PPROCESSINFO pi;
+ PCLS Class = NULL;
+ RTL_ATOM ClassAtom = 0;
+ NTSTATUS Status;
+
+ Status = CaptureUnicodeStringOrAtom(&SafeClassName, ClassName);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("Error capturing the class name\n");
+ SetLastNtError(Status);
+ return FALSE;
+ }
+
+ UserEnterExclusive();
+
+ pi = GetW32ProcessInfo();
+
+ ClassAtom = IntGetClassAtom(&SafeClassName,
+ hInstance,
+ pi,
+ &Class,
+ NULL);
+ if (!ClassAtom)
+ {
EngSetLastError(ERROR_CLASS_DOES_NOT_EXIST);
- }
- }
-
- if (SafeClassName.Length) ExFreePoolWithTag(SafeClassName.Buffer, TAG_STRING);
- UserLeave();
+ }
+
+
+ if (SafeClassName.Buffer && !IS_ATOM(SafeClassName.Buffer))
+ ExFreePoolWithTag(SafeClassName.Buffer, TAG_STRING);
+
+ UserLeave();
//
// Don't forget to use DesktopPtrToUser( ? ) with return pointer in user space.
//
- return Class;
+ return Class;
}
/* EOF */
Modified: trunk/reactos/win32ss/user/ntuser/class.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/class.…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/class.h [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/class.h [iso-8859-1] Wed Aug 1 23:52:43 2012
@@ -48,8 +48,10 @@
IN PCALLPROCDATA CallProc);
BOOL
-IntGetAtomFromStringOrAtom(IN PUNICODE_STRING ClassName,
- OUT RTL_ATOM *Atom);
+NTAPI
+IntGetAtomFromStringOrAtom(
+ _In_ PUNICODE_STRING ClassName,
+ _Out_ RTL_ATOM *Atom);
BOOL
IntCheckProcessDesktopClasses(IN PDESKTOP Desktop,