From d1c5f68dcaa9bc88aa5379116745e57c4c7f206f Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Fri, 2 Sep 2005 15:19:42 +0000
Subject: [PATCH] Added an entry point routine for native drivers.

---
 dlls/winecrt0/Makefile.in |  1 +
 dlls/winecrt0/drv_entry.c | 40 +++++++++++++++++++++++++++++++++++++++
 tools/winebuild/import.c  |  2 +-
 3 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 dlls/winecrt0/drv_entry.c

diff --git a/dlls/winecrt0/Makefile.in b/dlls/winecrt0/Makefile.in
index ada0e66e6be..be56c979d9a 100644
--- a/dlls/winecrt0/Makefile.in
+++ b/dlls/winecrt0/Makefile.in
@@ -8,6 +8,7 @@ C_SRCS = \
 	delay_load.c \
 	dll_entry.c \
 	dll_main.c \
+	drv_entry.c \
 	exe_entry.c \
 	exe_main.c \
 	exe_wentry.c \
diff --git a/dlls/winecrt0/drv_entry.c b/dlls/winecrt0/drv_entry.c
new file mode 100644
index 00000000000..7beb8f55aa8
--- /dev/null
+++ b/dlls/winecrt0/drv_entry.c
@@ -0,0 +1,40 @@
+/*
+ * Default entry point for a native driver
+ *
+ * Copyright 2005 Alexandre Julliard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "winternl.h"
+#include "wine/library.h"
+#include "crt0_private.h"
+
+struct _DRIVER_OBJECT;
+extern NTSTATUS DriverEntry( struct _DRIVER_OBJECT *obj, UNICODE_STRING *path );
+
+NTSTATUS __wine_spec_drv_entry( struct _DRIVER_OBJECT *obj, UNICODE_STRING *path )
+{
+    BOOL needs_init = (__wine_spec_init_state != CONSTRUCTORS_DONE);
+    NTSTATUS ret;
+
+    if (needs_init) _init( __wine_main_argc, __wine_main_argv, __wine_main_environ );
+    ret = DriverEntry( obj, path );
+    if (needs_init) _fini();
+    ExitProcess( ret );
+}
diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c
index 989e5bb0fff..16ea7fa252e 100644
--- a/tools/winebuild/import.c
+++ b/tools/winebuild/import.c
@@ -470,7 +470,7 @@ static int has_stubs( const DLLSPEC *spec )
 static const char *get_default_entry_point( const DLLSPEC *spec )
 {
     if (spec->characteristics & IMAGE_FILE_DLL) return "__wine_spec_dll_entry";
-    if (spec->subsystem == IMAGE_SUBSYSTEM_NATIVE) return "DriverEntry";
+    if (spec->subsystem == IMAGE_SUBSYSTEM_NATIVE) return "__wine_spec_drv_entry";
     return "__wine_spec_exe_entry";
 }
 
-- 
GitLab