Author: ion
Date: Sat Jul 23 02:17:26 2011
New Revision: 52788

URL: http://svn.reactos.org/svn/reactos?rev=52788&view=rev
Log:
[KERNEL32]: Fix the object macros to be MSVC/C99 compatible. Also allow for the 
variadic part to contain no arguments.
[KERNEL32]: Fix bugs #7, #8, #9, #10: CreateJobObjectW did not add OBJ_OPENIF 
to named jobs, it did not add named objects in the BaseNamedObjects directory, 
it did not correctly set ERROR_ALREADY_EXISTS when collisions happened, and it 
did not set ERROR_SUCCESS when the object was created. All this was fixed by 
using the new CreateNtObjectFromWin32Api macro.

Modified:
    trunk/reactos/dll/win32/kernel32/client/job.c
    trunk/reactos/dll/win32/kernel32/include/base_x.h

Modified: trunk/reactos/dll/win32/kernel32/client/job.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/client/job.c?rev=52788&r1=52787&r2=52788&view=diff
==============================================================================
--- trunk/reactos/dll/win32/kernel32/client/job.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/client/job.c [iso-8859-1] Sat Jul 23 
02:17:26 2011
@@ -18,72 +18,29 @@
 
 /* FUNCTIONS ****************************************************************/
 
-
 /*
  * @implemented
  */
 HANDLE
 WINAPI
-CreateJobObjectA(LPSECURITY_ATTRIBUTES lpJobAttributes,
-                 LPCSTR lpName)
+CreateJobObjectA(IN LPSECURITY_ATTRIBUTES lpJobAttributes,
+                 IN LPCSTR lpName)
 {
     /* Call the W(ide) function */
     ConvertWin32AnsiObjectApiToUnicodeApi(JobObject, lpName, lpJobAttributes);
 }
 
-
 /*
  * @implemented
  */
 HANDLE
 WINAPI
-CreateJobObjectW(LPSECURITY_ATTRIBUTES lpJobAttributes,
-                 LPCWSTR lpName)
-{
-    UNICODE_STRING JobName;
-    OBJECT_ATTRIBUTES ObjectAttributes;
-    ULONG Attributes = 0;
-    PVOID SecurityDescriptor;
-    HANDLE hJob;
-    NTSTATUS Status;
-
-    if (lpName != NULL)
-    {
-        RtlInitUnicodeString(&JobName, lpName);
-    }
-
-    if (lpJobAttributes != NULL)
-    {
-        if (lpJobAttributes->bInheritHandle)
-        {
-            Attributes |= OBJ_INHERIT;
-        }
-
-        SecurityDescriptor = lpJobAttributes->lpSecurityDescriptor;
-    }
-    else
-    {
-        SecurityDescriptor = NULL;
-    }
-
-    InitializeObjectAttributes(&ObjectAttributes,
-                               ((lpName != NULL) ? &JobName : NULL),
-                               Attributes,
-                               NULL,
-                               SecurityDescriptor);
-
-    Status = NtCreateJobObject(&hJob,
-                               JOB_OBJECT_ALL_ACCESS,
-                               &ObjectAttributes);
-    if (!NT_SUCCESS(Status))
-    {
-        SetLastErrorByStatus(Status);
-        return NULL;
-    }
-
-    return hJob;
-}
-
+CreateJobObjectW(IN LPSECURITY_ATTRIBUTES lpJobAttributes,
+                 IN LPCWSTR lpName)
+{
+    /* Create the NT object */
+    CreateNtObjectFromWin32Api(JobObject, JobObject, JOB, lpJobAttributes, 
lpName);
+}
 
 /*
  * @implemented

Modified: trunk/reactos/dll/win32/kernel32/include/base_x.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/include/base_x.h?rev=52788&r1=52787&r2=52788&view=diff
==============================================================================
--- 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 
02:17:26 2011
@@ -51,21 +51,21 @@
 // This macro uses the ConvertAnsiToUnicode macros above to convert a 
CreateXxxA
 // Win32 API into its equivalent CreateXxxW API.
 //
-#define ConvertWin32AnsiObjectApiToUnicodeApi(obj, name, args...)              
 \
+#define ConvertWin32AnsiObjectApiToUnicodeApi(obj, name, ...)                  
 \
     ConvertAnsiToUnicodePrologue                                               
 \
-    if (!name) return Create##obj##W(args, NULL);                              
 \
+    if (!name) return Create##obj##W(__VA_ARGS__, NULL);                       
 \
     ConvertAnsiToUnicodeBody(name)                                             
 \
-    if (NT_SUCCESS(Status)) return Create##obj##W(args, UnicodeCache->Buffer); 
 \
+    if (NT_SUCCESS(Status)) return Create##obj##W(__VA_ARGS__, 
UnicodeCache->Buffer);  \
     ConvertAnsiToUnicodeEpilogue
 
 //
 // This macro uses the ConvertAnsiToUnicode macros above to convert a 
FindFirst*A
 // Win32 API into its equivalent FindFirst*W API.
 //
-#define ConvertWin32AnsiChangeApiToUnicodeApi(obj, name, args...)              
 \
+#define ConvertWin32AnsiChangeApiToUnicodeApi(obj, name, ...)                  
 \
     ConvertAnsiToUnicodePrologue                                               
 \
     ConvertAnsiToUnicodeBody(name)                                             
 \
-    if (NT_SUCCESS(Status)) return obj##W(UnicodeCache->Buffer, args);         
 \
+    if (NT_SUCCESS(Status)) return obj##W(UnicodeCache->Buffer, 
##__VA_ARGS__); \
     ConvertAnsiToUnicodeEpilogue
 
 //
@@ -87,8 +87,8 @@
     ObjectAttributes = BasepConvertObjectAttributes(&LocalAttributes,          
 \
                                                     sec,                       
 \
                                                     name ? &ObjectName : NULL);
-#define CreateNtObjectFromWin32ApiBody(ntobj, access, args...)                 
 \
-    Status = NtCreate##ntobj(&Handle, access, ObjectAttributes, args);
+#define CreateNtObjectFromWin32ApiBody(ntobj, access, ...)                     
 \
+    Status = NtCreate##ntobj(&Handle, access, ObjectAttributes, ##__VA_ARGS__);
 #define CreateNtObjectFromWin32ApiEpilogue                                     
 \
     if (NT_SUCCESS(Status))                                                    
 \
     {                                                                          
 \
@@ -111,8 +111,8 @@
 // be improved to support caller-specified access masks, as the underlying 
macro
 // above does support this.
 //
-#define CreateNtObjectFromWin32Api(obj, ntobj, capsobj, sec, name, args...)    
 \
+#define CreateNtObjectFromWin32Api(obj, ntobj, capsobj, sec, name, ...)        
 \
     CreateNtObjectFromWin32ApiPrologue(sec, name);                             
 \
-    CreateNtObjectFromWin32ApiBody(ntobj, capsobj##_ALL_ACCESS, args);         
 \
+    CreateNtObjectFromWin32ApiBody(ntobj, capsobj##_ALL_ACCESS, 
##__VA_ARGS__); \
     CreateNtObjectFromWin32ApiEpilogue
 


Reply via email to