2 * COPYRIGHT: See COPYING in the top level directory
4 * FILE: reactos/dll/win32/netapi32/srvsvc.c
5 * PURPOSE: Server service interface code
6 * PROGRAMMERS: Eric Kohl <eric.kohl@reactos.org>
9 /* INCLUDES ******************************************************************/
14 WINE_DEFAULT_DEBUG_CHANNEL(netapi32
);
16 /* FUNCTIONS *****************************************************************/
19 SRVSVC_HANDLE_bind(SRVSVC_HANDLE pszSystemName
)
21 handle_t hBinding
= NULL
;
22 LPWSTR pszStringBinding
;
25 TRACE("SRVSVC_HANDLE_bind() called\n");
27 status
= RpcStringBindingComposeW(NULL
,
29 (RPC_WSTR
)pszSystemName
,
35 TRACE("RpcStringBindingCompose returned 0x%x\n", status
);
39 /* Set the binding handle that will be used to bind to the server. */
40 status
= RpcBindingFromStringBindingW(pszStringBinding
,
44 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status
);
47 status
= RpcStringFreeW(&pszStringBinding
);
50 // TRACE("RpcStringFree returned 0x%x\n", status);
58 SRVSVC_HANDLE_unbind(SRVSVC_HANDLE pszSystemName
,
63 TRACE("SRVSVC_HANDLE_unbind() called\n");
65 status
= RpcBindingFree(&hBinding
);
68 TRACE("RpcBindingFree returned 0x%x\n", status
);
76 _In_ LPCWSTR UncServerName
,
77 _Out_ LPBYTE
*BufferPtr
)
79 NET_API_STATUS status
;
81 TRACE("NetRemoteTOD(%s, %p)\n", debugstr_w(UncServerName
),
88 status
= NetrRemoteTOD((SRVSVC_HANDLE
)UncServerName
,
89 (LPTIME_OF_DAY_INFO
*)BufferPtr
);
91 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
93 status
= I_RpcMapWin32Status(RpcExceptionCode());
104 _In_ LMSTR servername
,
105 _In_ LMSTR UncClientName
,
108 NET_API_STATUS status
;
110 TRACE("NetSessionDel(%s %s %s)\n",
111 debugstr_w(servername
), debugstr_w(UncClientName
), debugstr_w(username
));
115 status
= NetrSessionDel(servername
,
119 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
121 status
= I_RpcMapWin32Status(RpcExceptionCode());
132 _In_ LMSTR servername
,
133 _In_ LMSTR UncClientName
,
136 _Out_ LPBYTE
*bufptr
,
137 _In_ DWORD prefmaxlen
,
138 _Out_ LPDWORD entriesread
,
139 _Out_ LPDWORD totalentries
,
140 _Inout_ LPDWORD resume_handle
)
142 SESSION_ENUM_STRUCT EnumStruct
;
143 SESSION_INFO_0_CONTAINER Level0Container
= {0, NULL
};
144 SESSION_INFO_1_CONTAINER Level1Container
= {0, NULL
};
145 SESSION_INFO_2_CONTAINER Level2Container
= {0, NULL
};
146 SESSION_INFO_10_CONTAINER Level10Container
= {0, NULL
};
147 SESSION_INFO_502_CONTAINER Level502Container
= {0, NULL
};
148 NET_API_STATUS status
;
150 FIXME("NetSessionEnum(%s %s %s %lu %p %lu %p %p %p)\n",
151 debugstr_w(servername
), debugstr_w(UncClientName
), debugstr_w(username
),
152 level
, bufptr
, prefmaxlen
, entriesread
, totalentries
, resume_handle
);
154 if (level
> 2 && level
!= 10 && level
!= 502)
155 return ERROR_INVALID_LEVEL
;
157 if (UncClientName
== NULL
|| username
== NULL
)
158 return ERROR_INVALID_PARAMETER
;
163 EnumStruct
.Level
= level
;
167 EnumStruct
.SessionInfo
.Level0
= &Level0Container
;
171 EnumStruct
.SessionInfo
.Level1
= &Level1Container
;
175 EnumStruct
.SessionInfo
.Level2
= &Level2Container
;
179 EnumStruct
.SessionInfo
.Level10
= &Level10Container
;
183 EnumStruct
.SessionInfo
.Level502
= &Level502Container
;
189 status
= NetrSessionEnum(servername
,
200 if (EnumStruct
.SessionInfo
.Level0
->Buffer
!= NULL
)
202 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level0
->Buffer
;
203 *entriesread
= EnumStruct
.SessionInfo
.Level0
->EntriesRead
;
208 if (EnumStruct
.SessionInfo
.Level1
->Buffer
!= NULL
)
210 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level1
->Buffer
;
211 *entriesread
= EnumStruct
.SessionInfo
.Level1
->EntriesRead
;
216 if (EnumStruct
.SessionInfo
.Level2
->Buffer
!= NULL
)
218 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level2
->Buffer
;
219 *entriesread
= EnumStruct
.SessionInfo
.Level2
->EntriesRead
;
224 if (EnumStruct
.SessionInfo
.Level10
->Buffer
!= NULL
)
226 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level10
->Buffer
;
227 *entriesread
= EnumStruct
.SessionInfo
.Level10
->EntriesRead
;
232 if (EnumStruct
.SessionInfo
.Level502
->Buffer
!= NULL
)
234 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level502
->Buffer
;
235 *entriesread
= EnumStruct
.SessionInfo
.Level502
->EntriesRead
;
240 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
242 status
= I_RpcMapWin32Status(RpcExceptionCode());
253 _In_ LMSTR servername
,
254 _In_ LMSTR UncClientName
,
257 _Out_ LPBYTE
*bufptr
)
259 SESSION_ENUM_STRUCT EnumStruct
;
260 SESSION_INFO_0_CONTAINER Level0Container
= {0, NULL
};
261 SESSION_INFO_1_CONTAINER Level1Container
= {0, NULL
};
262 SESSION_INFO_2_CONTAINER Level2Container
= {0, NULL
};
263 SESSION_INFO_10_CONTAINER Level10Container
= {0, NULL
};
264 DWORD dwTotalEntries
;
265 NET_API_STATUS status
;
267 FIXME("NetSessionGetInfo(%s %s %s %lu %p)\n",
268 debugstr_w(servername
), debugstr_w(UncClientName
),
269 debugstr_w(username
), level
, bufptr
);
271 if (level
> 2 && level
!= 10)
272 return ERROR_INVALID_LEVEL
;
274 if (UncClientName
== NULL
|| username
== NULL
)
275 return ERROR_INVALID_PARAMETER
;
279 EnumStruct
.Level
= level
;
283 EnumStruct
.SessionInfo
.Level0
= &Level0Container
;
287 EnumStruct
.SessionInfo
.Level1
= &Level1Container
;
291 EnumStruct
.SessionInfo
.Level2
= &Level2Container
;
295 EnumStruct
.SessionInfo
.Level10
= &Level10Container
;
301 status
= NetrSessionEnum(servername
,
305 MAX_PREFERRED_LENGTH
, //(DWORD)-1,
312 if (EnumStruct
.SessionInfo
.Level0
->Buffer
!= NULL
)
313 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level0
->Buffer
;
317 if (EnumStruct
.SessionInfo
.Level1
->Buffer
!= NULL
)
318 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level1
->Buffer
;
322 if (EnumStruct
.SessionInfo
.Level2
->Buffer
!= NULL
)
323 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level2
->Buffer
;
327 if (EnumStruct
.SessionInfo
.Level10
->Buffer
!= NULL
)
328 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level10
->Buffer
;
332 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
334 status
= I_RpcMapWin32Status(RpcExceptionCode());
345 _In_ LMSTR servername
,
348 _Out_ LPDWORD parm_err
)
350 NET_API_STATUS status
;
352 TRACE("NetShareAdd(%s %lu %p %p)\n",
353 debugstr_w(servername
), level
, buf
, parm_err
);
355 if (level
!= 2 && level
!= 502 && level
!= 503)
356 return ERROR_INVALID_LEVEL
;
360 status
= NetrShareAdd(servername
,
365 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
367 status
= I_RpcMapWin32Status(RpcExceptionCode());
378 _In_ LMSTR servername
,
382 NET_API_STATUS status
;
384 TRACE("NetShareCheck(%s %s %p)\n",
385 debugstr_w(servername
), debugstr_w(device
), type
);
389 status
= NetrShareCheck(servername
,
393 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
395 status
= I_RpcMapWin32Status(RpcExceptionCode());
406 _In_ LMSTR servername
,
410 NET_API_STATUS status
;
412 TRACE("NetShareDel(%s %s %lu)\n",
413 debugstr_w(servername
), debugstr_w(netname
), reserved
);
415 if (netname
== NULL
|| (*netname
== 0) || reserved
!= 0)
416 return ERROR_INVALID_PARAMETER
;
420 status
= NetrShareDel(servername
,
424 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
426 status
= I_RpcMapWin32Status(RpcExceptionCode());
437 _In_ LMSTR servername
,
441 NET_API_STATUS status
;
443 TRACE("NetShareDelSticky(%s %s %lu)\n",
444 debugstr_w(servername
), debugstr_w(netname
), reserved
);
446 if (netname
== NULL
|| (*netname
== 0) || reserved
!= 0)
447 return ERROR_INVALID_PARAMETER
;
451 status
= NetrShareDelSticky(servername
,
455 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
457 status
= I_RpcMapWin32Status(RpcExceptionCode());
468 _In_ LMSTR servername
,
470 _Out_ LPBYTE
*bufptr
,
471 _In_ DWORD prefmaxlen
,
472 _Out_ LPDWORD entriesread
,
473 _Out_ LPDWORD totalentries
,
474 _Inout_ LPDWORD resume_handle
)
476 SHARE_ENUM_STRUCT EnumStruct
;
477 SHARE_INFO_0_CONTAINER Level0Container
= {0, NULL
};
478 SHARE_INFO_1_CONTAINER Level1Container
= {0, NULL
};
479 SHARE_INFO_2_CONTAINER Level2Container
= {0, NULL
};
480 SHARE_INFO_502_CONTAINER Level502Container
= {0, NULL
};
481 NET_API_STATUS status
;
483 TRACE("NetShareEnum(%s %lu %p %lu %p %p %p)\n",
484 debugstr_w(servername
), level
, bufptr
, prefmaxlen
,
485 entriesread
, totalentries
, resume_handle
);
487 if (level
> 2 && level
!= 502)
488 return ERROR_INVALID_LEVEL
;
494 EnumStruct
.Level
= level
;
498 EnumStruct
.ShareInfo
.Level0
= &Level0Container
;
502 EnumStruct
.ShareInfo
.Level1
= &Level1Container
;
506 EnumStruct
.ShareInfo
.Level2
= &Level2Container
;
510 EnumStruct
.ShareInfo
.Level502
= &Level502Container
;
516 status
= NetrShareEnum(servername
,
525 if (EnumStruct
.ShareInfo
.Level0
->Buffer
!= NULL
)
527 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level0
->Buffer
;
528 *entriesread
= EnumStruct
.ShareInfo
.Level0
->EntriesRead
;
533 if (EnumStruct
.ShareInfo
.Level1
->Buffer
!= NULL
)
535 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level1
->Buffer
;
536 *entriesread
= EnumStruct
.ShareInfo
.Level1
->EntriesRead
;
541 if (EnumStruct
.ShareInfo
.Level2
->Buffer
!= NULL
)
543 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level2
->Buffer
;
544 *entriesread
= EnumStruct
.ShareInfo
.Level2
->EntriesRead
;
549 if (EnumStruct
.ShareInfo
.Level502
->Buffer
!= NULL
)
551 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level502
->Buffer
;
552 *entriesread
= EnumStruct
.ShareInfo
.Level502
->EntriesRead
;
557 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
559 status
= I_RpcMapWin32Status(RpcExceptionCode());
570 _In_ LMSTR servername
,
572 _Out_ LPBYTE
*bufptr
,
573 _In_ DWORD prefmaxlen
,
574 _Out_ LPDWORD entriesread
,
575 _Out_ LPDWORD totalentries
,
576 _Inout_ LPDWORD resume_handle
)
578 SHARE_ENUM_STRUCT EnumStruct
;
579 SHARE_INFO_0_CONTAINER Level0Container
= {0, NULL
};
580 SHARE_INFO_1_CONTAINER Level1Container
= {0, NULL
};
581 SHARE_INFO_2_CONTAINER Level2Container
= {0, NULL
};
582 SHARE_INFO_502_CONTAINER Level502Container
= {0, NULL
};
583 NET_API_STATUS status
;
585 TRACE("NetShareEnumSticky(%s %lu %p %lu %p %p %p)\n",
586 debugstr_w(servername
), level
, bufptr
, prefmaxlen
,
587 entriesread
, totalentries
, resume_handle
);
589 if (level
> 2 && level
!= 502)
590 return ERROR_INVALID_LEVEL
;
596 EnumStruct
.Level
= level
;
600 EnumStruct
.ShareInfo
.Level0
= &Level0Container
;
604 EnumStruct
.ShareInfo
.Level1
= &Level1Container
;
608 EnumStruct
.ShareInfo
.Level2
= &Level2Container
;
612 EnumStruct
.ShareInfo
.Level502
= &Level502Container
;
618 status
= NetrShareEnum(servername
,
619 (LPSHARE_ENUM_STRUCT
)&EnumStruct
,
627 if (EnumStruct
.ShareInfo
.Level0
->Buffer
!= NULL
)
629 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level0
->Buffer
;
630 *entriesread
= EnumStruct
.ShareInfo
.Level0
->EntriesRead
;
635 if (EnumStruct
.ShareInfo
.Level1
->Buffer
!= NULL
)
637 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level1
->Buffer
;
638 *entriesread
= EnumStruct
.ShareInfo
.Level1
->EntriesRead
;
643 if (EnumStruct
.ShareInfo
.Level2
->Buffer
!= NULL
)
645 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level2
->Buffer
;
646 *entriesread
= EnumStruct
.ShareInfo
.Level2
->EntriesRead
;
651 if (EnumStruct
.ShareInfo
.Level502
->Buffer
!= NULL
)
653 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level502
->Buffer
;
654 *entriesread
= EnumStruct
.ShareInfo
.Level502
->EntriesRead
;
659 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
661 status
= I_RpcMapWin32Status(RpcExceptionCode());
672 _In_ LMSTR servername
,
675 _Out_ LPBYTE
*bufptr
)
677 NET_API_STATUS status
;
679 TRACE("NetShareGetInfo(%s %s %lu %p)\n",
680 debugstr_w(servername
), debugstr_w(netname
), level
, bufptr
);
682 if (level
> 2 && level
!= 502 && level
!= 1005)
683 return ERROR_INVALID_LEVEL
;
685 if (netname
== NULL
|| *netname
== 0)
686 return ERROR_INVALID_PARAMETER
;
692 status
= NetrShareGetInfo(servername
,
695 (LPSHARE_INFO
)bufptr
);
697 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
699 status
= I_RpcMapWin32Status(RpcExceptionCode());
710 _In_ LPWSTR servername
,
714 _Out_ LPDWORD parm_err
)
716 NET_API_STATUS status
;
718 TRACE("NetShareSetInfo(%s %s %lu %p %p)\n",
719 debugstr_w(servername
), debugstr_w(netname
), level
, buf
, parm_err
);
721 if (level
!= 2 && level
!= 502 && level
!= 503 && level
!= 1004 &&
722 level
!= 1005 && level
!= 1006 && level
!= 1501)
723 return ERROR_INVALID_LEVEL
;
727 status
= NetrShareSetInfo(servername
,
733 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
735 status
= I_RpcMapWin32Status(RpcExceptionCode());