Added some stubbed Ds-calls
Start of conformance tests for these Ds-calls.
diff --git a/dlls/netapi32/Makefile.in b/dlls/netapi32/Makefile.in
index 8bb7932..b898d10 100644
--- a/dlls/netapi32/Makefile.in
+++ b/dlls/netapi32/Makefile.in
@@ -11,6 +11,7 @@
 	access.c \
 	apibuf.c \
 	browsr.c \
+	ds.c \
 	nbcmdqueue.c \
 	nbnamecache.c \
 	nbt.c \
diff --git a/dlls/netapi32/ds.c b/dlls/netapi32/ds.c
new file mode 100644
index 0000000..da7b9bb
--- /dev/null
+++ b/dlls/netapi32/ds.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2005 Paul Vriens
+ *
+ * netapi32 directory service functions
+ *
+ * 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 "winerror.h"
+#include "wine/debug.h"
+#include "dsrole.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(ds);
+
+/************************************************************
+ *  DsRoleFreeMemory (NETAPI32.@)
+ *
+ * PARAMS
+ *  Buffer [I] Pointer to the to-be-freed buffer.
+ *
+ * RETURNS
+ *  Nothing
+ */
+void WINAPI DsRoleFreeMemory(PVOID Buffer)
+{
+    FIXME("(%p) stub\n", Buffer);
+}
+/************************************************************
+ *  DsRoleGetPrimaryDomainInformation  (NETAPI32.@)
+ *
+ * PARAMS
+ *  lpServer  [I] Pointer to UNICODE string with Computername
+ *  InfoLevel [I] Type of data to retrieve	
+ *  Buffer    [O] Pointer to to the requested data
+ *
+ * RETURNS
+ *
+ * NOTES
+ *  When lpServer is NULL, use the local computer
+ */
+DWORD WINAPI DsRoleGetPrimaryDomainInformation(
+    LPCWSTR lpServer, DSROLE_PRIMARY_DOMAIN_INFO_LEVEL InfoLevel,
+    PBYTE* Buffer)
+{
+    FIXME("(%p, %d, %p) stub\n", lpServer, InfoLevel, Buffer);
+
+    /* Check some input parameters */
+
+    if (!Buffer) return ERROR_INVALID_PARAMETER;
+    if ((InfoLevel < DsRolePrimaryDomainInfoBasic) || (InfoLevel > DsRoleOperationState)) return ERROR_INVALID_PARAMETER;
+
+    return E_NOTIMPL;
+}
diff --git a/dlls/netapi32/netapi32.spec b/dlls/netapi32/netapi32.spec
index 412ac72..dbb42c4 100644
--- a/dlls/netapi32/netapi32.spec
+++ b/dlls/netapi32/netapi32.spec
@@ -1,3 +1,18 @@
+@ stub DsAddressToSiteNames
+@ stub DsAddressToSiteNamesEx
+@ stub DsDeregisterDnsHostRecords
+@ stub DsEnumerateDomainTrusts
+@ stub DsGetDcClose
+@ stub DsGetDcName
+@ stub DsGetDcNext
+@ stub DsGetDcOpen
+@ stub DsGetDcSiteCoverage
+@ stub DsGetForestTrustInformationW
+@ stub DsGetSiteName
+@ stub DsMergeForestTrustInformationW
+@ stdcall DsRoleFreeMemory(ptr)
+@ stdcall DsRoleGetPrimaryDomainInformation(wstr long ptr)
+@ stub DsValidateSubnetName
 @ stub I_BrowserDebugCall
 @ stub I_BrowserDebugTrace
 @ stdcall I_BrowserQueryEmulatedDomains(wstr ptr ptr)
diff --git a/dlls/netapi32/tests/.gitignore b/dlls/netapi32/tests/.gitignore
index 0c2c030..f0f950a 100644
--- a/dlls/netapi32/tests/.gitignore
+++ b/dlls/netapi32/tests/.gitignore
@@ -1,5 +1,6 @@
 Makefile
 access.ok
 apibuf.ok
+ds.ok
 testlist.c
 wksta.ok
diff --git a/dlls/netapi32/tests/Makefile.in b/dlls/netapi32/tests/Makefile.in
index 94f1971..0740f61 100644
--- a/dlls/netapi32/tests/Makefile.in
+++ b/dlls/netapi32/tests/Makefile.in
@@ -8,6 +8,7 @@
 CTESTS = \
 	access.c \
 	apibuf.c \
+	ds.c \
 	wksta.c
 
 @MAKE_TEST_RULES@
diff --git a/dlls/netapi32/tests/ds.c b/dlls/netapi32/tests/ds.c
new file mode 100644
index 0000000..1734156
--- /dev/null
+++ b/dlls/netapi32/tests/ds.c
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2005 Paul Vriens
+ *
+ * Conformance test of the ds functions.
+ *
+ * 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 <wine/test.h>
+#include <windef.h>
+#include <winbase.h>
+#include <winerror.h>
+#include <dsrole.h>
+
+static DWORD (WINAPI *pDsRoleGetPrimaryDomainInformation)(LPCWSTR, DSROLE_PRIMARY_DOMAIN_INFO_LEVEL, PBYTE*);
+static void  (WINAPI *pDsRoleFreeMemory)(PVOID);
+
+static void test_params(void)
+{
+    DWORD ret;
+    PDSROLE_PRIMARY_DOMAIN_INFO_BASIC dpdi;
+
+    SetLastError(0xdeadbeef);
+    ret = pDsRoleGetPrimaryDomainInformation(NULL, DsRolePrimaryDomainInfoBasic, NULL);
+    ok( ret == ERROR_INVALID_PARAMETER, "Expected error ERROR_INVALID_PARAMETER, got (%ld)\n", ret);
+
+    SetLastError(0xdeadbeef);
+    ret = pDsRoleGetPrimaryDomainInformation(NULL, 0, NULL);
+    ok( ret == ERROR_INVALID_PARAMETER, "Expected error ERROR_INVALID_PARAMETER, got (%ld)\n", ret);
+    SetLastError(0xdeadbeef);
+    ret = pDsRoleGetPrimaryDomainInformation(NULL, 4, NULL);
+    ok( ret == ERROR_INVALID_PARAMETER, "Expected error ERROR_INVALID_PARAMETER, got (%ld)\n", ret);
+
+    SetLastError(0xdeadbeef);
+    ret = pDsRoleGetPrimaryDomainInformation(NULL, 4, (PBYTE *)&dpdi);
+    ok( ret == ERROR_INVALID_PARAMETER, "Expected error ERROR_INVALID_PARAMETER, got (%ld)\n", ret);
+}
+
+static void test_get(void)
+{
+    DWORD ret;
+    PDSROLE_PRIMARY_DOMAIN_INFO_BASIC dpdi;
+    PDSROLE_UPGRADE_STATUS_INFO dusi;
+    PDSROLE_OPERATION_STATE_INFO dosi;
+
+    SetLastError(0xdeadbeef);
+    ret = pDsRoleGetPrimaryDomainInformation(NULL, DsRolePrimaryDomainInfoBasic, (PBYTE *)&dpdi);
+    todo_wine { ok( ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got (%ld)\n", ret); }
+    pDsRoleFreeMemory(&dpdi);
+
+    SetLastError(0xdeadbeef);
+    ret = pDsRoleGetPrimaryDomainInformation(NULL, DsRoleUpgradeStatus, (PBYTE *)&dusi);
+    todo_wine { ok( ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got (%ld)\n", ret); }
+    pDsRoleFreeMemory(&dusi);
+   
+    SetLastError(0xdeadbeef);
+    ret = pDsRoleGetPrimaryDomainInformation(NULL, DsRoleOperationState, (PBYTE *)&dosi);
+    todo_wine { ok( ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got (%ld)\n", ret); }
+    pDsRoleFreeMemory(&dosi);
+}
+
+
+START_TEST(ds)
+{
+    HMODULE hnetapi32;
+
+    hnetapi32 = LoadLibraryA("netapi32.dll");
+    if (!hnetapi32)
+        return;
+
+    SetLastError(0xdeadbeef);
+    pDsRoleGetPrimaryDomainInformation=(void*)GetProcAddress(hnetapi32,"DsRoleGetPrimaryDomainInformation");
+    if (!pDsRoleGetPrimaryDomainInformation)
+    {
+        trace("DsRoleGetPrimaryDomainInformation not implemented : (%ld), stop testing\n", GetLastError());
+        return;
+    }
+    pDsRoleFreeMemory=(void*)GetProcAddress(hnetapi32,"DsRoleFreeMemory");
+
+    test_params();
+    test_get();
+}
diff --git a/include/Makefile.in b/include/Makefile.in
index 18a6313..c97b0e1 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -121,6 +121,7 @@
 	dsdriver.h \
 	dshow.h \
 	dsound.h \
+	dsrole.h \
 	dxdiag.h \
 	dxerr8.h \
 	dxerr9.h \
diff --git a/include/dsrole.h b/include/dsrole.h
new file mode 100644
index 0000000..7364ace
--- /dev/null
+++ b/include/dsrole.h
@@ -0,0 +1,84 @@
+/*
+ * Directory Services definitions
+ *
+ * Copyright 2005 Paul Vriens
+ *
+ * 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
+ */
+
+#ifndef __WINE_DSROLE_H
+#define __WINE_DSROLE_H
+
+#define DSROLE_PRIMARY_DS_RUNNING           0x00000001
+#define DSROLE_PRIMARY_DS_MIXED_MODE        0x00000002
+#define DSROLE_UPGRADE_IN_PROGRESS          0x00000004
+#define DSROLE_PRIMARY_DOMAIN_GUID_PRESENT  0x01000000
+
+typedef enum _DSROLE_PRIMARY_DOMAIN_INFO_LEVEL
+{
+    DsRolePrimaryDomainInfoBasic = 1,
+    DsRoleUpgradeStatus,
+    DsRoleOperationState
+} DSROLE_PRIMARY_DOMAIN_INFO_LEVEL;
+
+typedef enum _DSROLE_MACHINE_ROLE
+{
+  DsRole_RoleStandaloneWorkstation = 0,
+  DsRole_RoleMemberWorkstation,
+  DsRole_RoleStandaloneServer,
+  DsRole_RoleMemberServer,
+  DsRole_RoleBackupDomainController,
+  DsRole_RolePrimaryDomainController
+} DSROLE_MACHINE_ROLE;
+
+typedef enum _DSROLE_SERVER_STATE
+{
+  DsRoleServerUnknown = 0,
+  DsRoleServerPrimary,
+  DsRoleServerBackup
+} DSROLE_SERVER_STATE;
+
+typedef enum _DSROLE_OPERATION_STATE
+{
+  DsRoleOperationIdle = 0,
+  DsRoleOperationActive,
+  DsRoleOperationNeedReboot
+} DSROLE_OPERATION_STATE;
+
+typedef struct _DSROLE_PRIMARY_DOMAIN_INFO_BASIC
+{
+    DSROLE_MACHINE_ROLE MachineRole;
+    ULONG Flags;
+    LPWSTR DomainNameFlat;
+    LPWSTR DomainNameDns;
+    LPWSTR DomainForestName;
+    GUID DomainGuid;
+} DSROLE_PRIMARY_DOMAIN_INFO_BASIC, *PDSROLE_PRIMARY_DOMAIN_INFO_BASIC;
+
+typedef struct _DSROLE_UPGRADE_STATUS_INFO
+{
+    ULONG OperationState;
+    DSROLE_SERVER_STATE PreviousServerState;
+} DSROLE_UPGRADE_STATUS_INFO, *PDSROLE_UPGRADE_STATUS_INFO;
+
+typedef struct _DSROLE_OPERATION_STATE_INFO
+{
+    DSROLE_OPERATION_STATE OperationState;
+} DSROLE_OPERATION_STATE_INFO, *PDSROLE_OPERATION_STATE_INFO;
+
+VOID WINAPI DsRoleFreeMemory(IN PVOID Buffer);
+DWORD WINAPI DsRoleGetPrimaryDomainInformation(IN LPCWSTR lpServer OPTIONAL, IN DSROLE_PRIMARY_DOMAIN_INFO_LEVEL InfoLevel, OUT PBYTE *Buffer);
+
+#endif /* __WINE_DSROLE_H */