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_ LMSTR servername
,
79 NET_API_STATUS status
;
81 TRACE("NetFileClose(%s %lu)\n",
82 debugstr_w(servername
), fileid
);
86 status
= NetrFileClose(servername
,
89 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
91 status
= I_RpcMapWin32Status(RpcExceptionCode());
102 _In_ LMSTR servername
,
106 _Out_ LPBYTE
*bufptr
,
107 _In_ DWORD prefmaxlen
,
108 _Out_ LPDWORD entriesread
,
109 _Out_ LPDWORD totalentries
,
110 _Inout_ PDWORD_PTR resume_handle
)
112 FILE_ENUM_STRUCT EnumStruct
;
113 FILE_INFO_2_CONTAINER Level2Container
= {0, NULL
};
114 FILE_INFO_3_CONTAINER Level3Container
= {0, NULL
};
115 NET_API_STATUS status
;
117 TRACE("NetFileEnum(%s %s %s %lu %p %lu %p %p %p)\n",
118 debugstr_w(servername
), debugstr_w(basepath
), debugstr_w(username
),
119 level
, bufptr
, prefmaxlen
, entriesread
, totalentries
, resume_handle
);
121 if (level
!= 2 && level
!= 3)
122 return ERROR_INVALID_LEVEL
;
124 EnumStruct
.Level
= level
;
128 EnumStruct
.FileInfo
.Level2
= &Level2Container
;
132 EnumStruct
.FileInfo
.Level3
= &Level3Container
;
138 status
= NetrFileEnum(servername
,
144 (PDWORD
)resume_handle
);
149 if (EnumStruct
.FileInfo
.Level2
->Buffer
!= NULL
)
151 *bufptr
= (LPBYTE
)EnumStruct
.FileInfo
.Level2
->Buffer
;
152 *entriesread
= EnumStruct
.FileInfo
.Level2
->EntriesRead
;
157 if (EnumStruct
.FileInfo
.Level3
->Buffer
!= NULL
)
159 *bufptr
= (LPBYTE
)EnumStruct
.FileInfo
.Level3
->Buffer
;
160 *entriesread
= EnumStruct
.FileInfo
.Level3
->EntriesRead
;
165 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
167 status
= I_RpcMapWin32Status(RpcExceptionCode());
178 _In_ LMSTR servername
,
181 _Out_ LPBYTE
*bufptr
)
183 NET_API_STATUS status
;
185 TRACE("NetFileGetInfo(%s %lu %lu %p)\n",
186 debugstr_w(servername
), fileid
, level
, bufptr
);
192 status
= NetrFileGetInfo(servername
,
195 (LPFILE_INFO
)bufptr
);
197 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
199 status
= I_RpcMapWin32Status(RpcExceptionCode());
210 _In_ LPCWSTR UncServerName
,
211 _Out_ LPBYTE
*BufferPtr
)
213 NET_API_STATUS status
;
215 TRACE("NetRemoteTOD(%s %p)\n",
216 debugstr_w(UncServerName
), BufferPtr
);
222 status
= NetrRemoteTOD((SRVSVC_HANDLE
)UncServerName
,
223 (LPTIME_OF_DAY_INFO
*)BufferPtr
);
225 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
227 status
= I_RpcMapWin32Status(RpcExceptionCode());
238 _In_ LMSTR servername
,
239 _In_ LMSTR UncClientName
,
242 NET_API_STATUS status
;
244 TRACE("NetSessionDel(%s %s %s)\n",
245 debugstr_w(servername
), debugstr_w(UncClientName
), debugstr_w(username
));
249 status
= NetrSessionDel(servername
,
253 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
255 status
= I_RpcMapWin32Status(RpcExceptionCode());
266 _In_ LMSTR servername
,
267 _In_ LMSTR UncClientName
,
270 _Out_ LPBYTE
*bufptr
,
271 _In_ DWORD prefmaxlen
,
272 _Out_ LPDWORD entriesread
,
273 _Out_ LPDWORD totalentries
,
274 _Inout_ LPDWORD resume_handle
)
276 SESSION_ENUM_STRUCT EnumStruct
;
277 SESSION_INFO_0_CONTAINER Level0Container
= {0, NULL
};
278 SESSION_INFO_1_CONTAINER Level1Container
= {0, NULL
};
279 SESSION_INFO_2_CONTAINER Level2Container
= {0, NULL
};
280 SESSION_INFO_10_CONTAINER Level10Container
= {0, NULL
};
281 SESSION_INFO_502_CONTAINER Level502Container
= {0, NULL
};
282 NET_API_STATUS status
;
284 TRACE("NetSessionEnum(%s %s %s %lu %p %lu %p %p %p)\n",
285 debugstr_w(servername
), debugstr_w(UncClientName
), debugstr_w(username
),
286 level
, bufptr
, prefmaxlen
, entriesread
, totalentries
, resume_handle
);
288 if (level
> 2 && level
!= 10 && level
!= 502)
289 return ERROR_INVALID_LEVEL
;
291 if (UncClientName
== NULL
|| username
== NULL
)
292 return ERROR_INVALID_PARAMETER
;
297 EnumStruct
.Level
= level
;
301 EnumStruct
.SessionInfo
.Level0
= &Level0Container
;
305 EnumStruct
.SessionInfo
.Level1
= &Level1Container
;
309 EnumStruct
.SessionInfo
.Level2
= &Level2Container
;
313 EnumStruct
.SessionInfo
.Level10
= &Level10Container
;
317 EnumStruct
.SessionInfo
.Level502
= &Level502Container
;
323 status
= NetrSessionEnum(servername
,
334 if (EnumStruct
.SessionInfo
.Level0
->Buffer
!= NULL
)
336 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level0
->Buffer
;
337 *entriesread
= EnumStruct
.SessionInfo
.Level0
->EntriesRead
;
342 if (EnumStruct
.SessionInfo
.Level1
->Buffer
!= NULL
)
344 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level1
->Buffer
;
345 *entriesread
= EnumStruct
.SessionInfo
.Level1
->EntriesRead
;
350 if (EnumStruct
.SessionInfo
.Level2
->Buffer
!= NULL
)
352 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level2
->Buffer
;
353 *entriesread
= EnumStruct
.SessionInfo
.Level2
->EntriesRead
;
358 if (EnumStruct
.SessionInfo
.Level10
->Buffer
!= NULL
)
360 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level10
->Buffer
;
361 *entriesread
= EnumStruct
.SessionInfo
.Level10
->EntriesRead
;
366 if (EnumStruct
.SessionInfo
.Level502
->Buffer
!= NULL
)
368 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level502
->Buffer
;
369 *entriesread
= EnumStruct
.SessionInfo
.Level502
->EntriesRead
;
374 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
376 status
= I_RpcMapWin32Status(RpcExceptionCode());
387 _In_ LMSTR servername
,
388 _In_ LMSTR UncClientName
,
391 _Out_ LPBYTE
*bufptr
)
393 SESSION_ENUM_STRUCT EnumStruct
;
394 SESSION_INFO_0_CONTAINER Level0Container
= {0, NULL
};
395 SESSION_INFO_1_CONTAINER Level1Container
= {0, NULL
};
396 SESSION_INFO_2_CONTAINER Level2Container
= {0, NULL
};
397 SESSION_INFO_10_CONTAINER Level10Container
= {0, NULL
};
398 DWORD dwTotalEntries
;
399 NET_API_STATUS status
;
401 TRACE("NetSessionGetInfo(%s %s %s %lu %p)\n",
402 debugstr_w(servername
), debugstr_w(UncClientName
),
403 debugstr_w(username
), level
, bufptr
);
405 if (level
> 2 && level
!= 10)
406 return ERROR_INVALID_LEVEL
;
408 if (UncClientName
== NULL
|| username
== NULL
)
409 return ERROR_INVALID_PARAMETER
;
413 EnumStruct
.Level
= level
;
417 EnumStruct
.SessionInfo
.Level0
= &Level0Container
;
421 EnumStruct
.SessionInfo
.Level1
= &Level1Container
;
425 EnumStruct
.SessionInfo
.Level2
= &Level2Container
;
429 EnumStruct
.SessionInfo
.Level10
= &Level10Container
;
435 status
= NetrSessionEnum(servername
,
439 MAX_PREFERRED_LENGTH
, //(DWORD)-1,
446 if (EnumStruct
.SessionInfo
.Level0
->Buffer
!= NULL
)
447 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level0
->Buffer
;
451 if (EnumStruct
.SessionInfo
.Level1
->Buffer
!= NULL
)
452 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level1
->Buffer
;
456 if (EnumStruct
.SessionInfo
.Level2
->Buffer
!= NULL
)
457 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level2
->Buffer
;
461 if (EnumStruct
.SessionInfo
.Level10
->Buffer
!= NULL
)
462 *bufptr
= (LPBYTE
)EnumStruct
.SessionInfo
.Level10
->Buffer
;
466 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
468 status
= I_RpcMapWin32Status(RpcExceptionCode());
479 _In_ LMSTR servername
,
482 _Out_ LPDWORD parm_err
)
484 NET_API_STATUS status
;
486 TRACE("NetShareAdd(%s %lu %p %p)\n",
487 debugstr_w(servername
), level
, buf
, parm_err
);
489 if (level
!= 2 && level
!= 502 && level
!= 503)
490 return ERROR_INVALID_LEVEL
;
494 status
= NetrShareAdd(servername
,
499 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
501 status
= I_RpcMapWin32Status(RpcExceptionCode());
512 _In_ LMSTR servername
,
516 NET_API_STATUS status
;
518 TRACE("NetShareCheck(%s %s %p)\n",
519 debugstr_w(servername
), debugstr_w(device
), type
);
523 status
= NetrShareCheck(servername
,
527 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
529 status
= I_RpcMapWin32Status(RpcExceptionCode());
540 _In_ LMSTR servername
,
544 NET_API_STATUS status
;
546 TRACE("NetShareDel(%s %s %lu)\n",
547 debugstr_w(servername
), debugstr_w(netname
), reserved
);
549 if (netname
== NULL
|| (*netname
== 0) || reserved
!= 0)
550 return ERROR_INVALID_PARAMETER
;
554 status
= NetrShareDel(servername
,
558 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
560 status
= I_RpcMapWin32Status(RpcExceptionCode());
571 _In_ LMSTR servername
,
575 NET_API_STATUS status
;
577 TRACE("NetShareDelSticky(%s %s %lu)\n",
578 debugstr_w(servername
), debugstr_w(netname
), reserved
);
580 if (netname
== NULL
|| (*netname
== 0) || reserved
!= 0)
581 return ERROR_INVALID_PARAMETER
;
585 status
= NetrShareDelSticky(servername
,
589 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
591 status
= I_RpcMapWin32Status(RpcExceptionCode());
602 _In_ LMSTR servername
,
604 _Out_ LPBYTE
*bufptr
,
605 _In_ DWORD prefmaxlen
,
606 _Out_ LPDWORD entriesread
,
607 _Out_ LPDWORD totalentries
,
608 _Inout_ LPDWORD resume_handle
)
610 SHARE_ENUM_STRUCT EnumStruct
;
611 SHARE_INFO_0_CONTAINER Level0Container
= {0, NULL
};
612 SHARE_INFO_1_CONTAINER Level1Container
= {0, NULL
};
613 SHARE_INFO_2_CONTAINER Level2Container
= {0, NULL
};
614 SHARE_INFO_502_CONTAINER Level502Container
= {0, NULL
};
615 NET_API_STATUS status
;
617 TRACE("NetShareEnum(%s %lu %p %lu %p %p %p)\n",
618 debugstr_w(servername
), level
, bufptr
, prefmaxlen
,
619 entriesread
, totalentries
, resume_handle
);
621 if (level
> 2 && level
!= 502)
622 return ERROR_INVALID_LEVEL
;
628 EnumStruct
.Level
= level
;
632 EnumStruct
.ShareInfo
.Level0
= &Level0Container
;
636 EnumStruct
.ShareInfo
.Level1
= &Level1Container
;
640 EnumStruct
.ShareInfo
.Level2
= &Level2Container
;
644 EnumStruct
.ShareInfo
.Level502
= &Level502Container
;
650 status
= NetrShareEnum(servername
,
659 if (EnumStruct
.ShareInfo
.Level0
->Buffer
!= NULL
)
661 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level0
->Buffer
;
662 *entriesread
= EnumStruct
.ShareInfo
.Level0
->EntriesRead
;
667 if (EnumStruct
.ShareInfo
.Level1
->Buffer
!= NULL
)
669 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level1
->Buffer
;
670 *entriesread
= EnumStruct
.ShareInfo
.Level1
->EntriesRead
;
675 if (EnumStruct
.ShareInfo
.Level2
->Buffer
!= NULL
)
677 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level2
->Buffer
;
678 *entriesread
= EnumStruct
.ShareInfo
.Level2
->EntriesRead
;
683 if (EnumStruct
.ShareInfo
.Level502
->Buffer
!= NULL
)
685 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level502
->Buffer
;
686 *entriesread
= EnumStruct
.ShareInfo
.Level502
->EntriesRead
;
691 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
693 status
= I_RpcMapWin32Status(RpcExceptionCode());
704 _In_ LMSTR servername
,
706 _Out_ LPBYTE
*bufptr
,
707 _In_ DWORD prefmaxlen
,
708 _Out_ LPDWORD entriesread
,
709 _Out_ LPDWORD totalentries
,
710 _Inout_ LPDWORD resume_handle
)
712 SHARE_ENUM_STRUCT EnumStruct
;
713 SHARE_INFO_0_CONTAINER Level0Container
= {0, NULL
};
714 SHARE_INFO_1_CONTAINER Level1Container
= {0, NULL
};
715 SHARE_INFO_2_CONTAINER Level2Container
= {0, NULL
};
716 SHARE_INFO_502_CONTAINER Level502Container
= {0, NULL
};
717 NET_API_STATUS status
;
719 TRACE("NetShareEnumSticky(%s %lu %p %lu %p %p %p)\n",
720 debugstr_w(servername
), level
, bufptr
, prefmaxlen
,
721 entriesread
, totalentries
, resume_handle
);
723 if (level
> 2 && level
!= 502)
724 return ERROR_INVALID_LEVEL
;
730 EnumStruct
.Level
= level
;
734 EnumStruct
.ShareInfo
.Level0
= &Level0Container
;
738 EnumStruct
.ShareInfo
.Level1
= &Level1Container
;
742 EnumStruct
.ShareInfo
.Level2
= &Level2Container
;
746 EnumStruct
.ShareInfo
.Level502
= &Level502Container
;
752 status
= NetrShareEnum(servername
,
753 (LPSHARE_ENUM_STRUCT
)&EnumStruct
,
761 if (EnumStruct
.ShareInfo
.Level0
->Buffer
!= NULL
)
763 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level0
->Buffer
;
764 *entriesread
= EnumStruct
.ShareInfo
.Level0
->EntriesRead
;
769 if (EnumStruct
.ShareInfo
.Level1
->Buffer
!= NULL
)
771 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level1
->Buffer
;
772 *entriesread
= EnumStruct
.ShareInfo
.Level1
->EntriesRead
;
777 if (EnumStruct
.ShareInfo
.Level2
->Buffer
!= NULL
)
779 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level2
->Buffer
;
780 *entriesread
= EnumStruct
.ShareInfo
.Level2
->EntriesRead
;
785 if (EnumStruct
.ShareInfo
.Level502
->Buffer
!= NULL
)
787 *bufptr
= (LPBYTE
)EnumStruct
.ShareInfo
.Level502
->Buffer
;
788 *entriesread
= EnumStruct
.ShareInfo
.Level502
->EntriesRead
;
793 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
795 status
= I_RpcMapWin32Status(RpcExceptionCode());
806 _In_ LMSTR servername
,
809 _Out_ LPBYTE
*bufptr
)
811 NET_API_STATUS status
;
813 TRACE("NetShareGetInfo(%s %s %lu %p)\n",
814 debugstr_w(servername
), debugstr_w(netname
), level
, bufptr
);
816 if (level
> 2 && level
!= 502 && level
!= 1005)
817 return ERROR_INVALID_LEVEL
;
819 if (netname
== NULL
|| *netname
== 0)
820 return ERROR_INVALID_PARAMETER
;
826 status
= NetrShareGetInfo(servername
,
829 (LPSHARE_INFO
)bufptr
);
831 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
833 status
= I_RpcMapWin32Status(RpcExceptionCode());
844 _In_ LPWSTR servername
,
848 _Out_ LPDWORD parm_err
)
850 NET_API_STATUS status
;
852 TRACE("NetShareSetInfo(%s %s %lu %p %p)\n",
853 debugstr_w(servername
), debugstr_w(netname
), level
, buf
, parm_err
);
855 if (level
!= 2 && level
!= 502 && level
!= 503 && level
!= 1004 &&
856 level
!= 1005 && level
!= 1006 && level
!= 1501)
857 return ERROR_INVALID_LEVEL
;
861 status
= NetrShareSetInfo(servername
,
867 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
869 status
= I_RpcMapWin32Status(RpcExceptionCode());