Author: ion Date: Sat Jul 23 00:28:33 2011 New Revision: 52785
URL: http://svn.reactos.org/svn/reactos?rev=52785&view=rev Log: [KERNEL32]: New macro, not yet used. This one implements the CreateXxxW APIs (or rather, will).
Modified: trunk/reactos/dll/win32/kernel32/include/base_x.h
Modified: trunk/reactos/dll/win32/kernel32/include/base_x.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/include/... ============================================================================== --- trunk/reactos/dll/win32/kernel32/include/base_x.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/kernel32/include/base_x.h [iso-8859-1] Sat Jul 23 00:28:33 2011 @@ -68,3 +68,51 @@ if (NT_SUCCESS(Status)) return obj##W(UnicodeCache->Buffer, args); \ 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 +// (Wide) Win32 object creation API. +// +// It makes use of BasepConvertObjectAttributes and allows for a custom access +// mode to be used, and also sets the correct error codes in case of a collision +// +#define CreateNtObjectFromWin32ApiPrologue(sec, name) \ +{ \ + NTSTATUS Status; \ + OBJECT_ATTRIBUTES LocalAttributes; \ + POBJECT_ATTRIBUTES ObjectAttributes; \ + HANDLE Handle; \ + UNICODE_STRING ObjectName; \ + if (name) RtlInitUnicodeString(&ObjectName, name); \ + ObjectAttributes = BasepConvertObjectAttributes(&LocalAttributes, \ + sec, \ + name ? &ObjectName : NULL); +#define CreateNtObjectFromWin32ApiBody(ntobj, access, args...) \ + Status = NtCreate##ntobj(&Handle, access, ObjectAttributes, args); +#define CreateNtObjectFromWin32ApiEpilogue \ + if (NT_SUCCESS(Status)) \ + { \ + if (Status == STATUS_OBJECT_NAME_EXISTS) \ + SetLastError(ERROR_ALREADY_EXISTS); \ + else \ + SetLastError(ERROR_SUCCESS); \ + return Handle; \ + } \ + SetLastErrorByStatus(Status); \ + return NULL; \ +} + +// +// This macro uses the CreateNtObjectFromWin32Api macros from above to create an +// NT object based on the Win32 API settings. +// +// Note that it is hardcoded to always use XXX_ALL_ACCESS permissions, which is +// the behavior up until Vista. When/if the target moves to Vista, the macro can +// be improved to support caller-specified access masks, as the underlying macro +// above does support this. +// +#define CreateNtObjectFromWin32Api(obj, ntobj, capsobj, sec, name, args...) \ + CreateNtObjectFromWin32ApiPrologue(sec, name); \ + CreateNtObjectFromWin32ApiBody(ntobj, capsobj##_ALL_ACCESS, args); \ + CreateNtObjectFromWin32ApiEpilogue +