/*++ Copyright (c) 1991 Microsoft Corporation Module Name: SvcCtrl.c Abstract: This file contains the RpcXlate code to handle the NetServiceControl API. Author: John Rogers (JohnRo) 13-Sep-1991 Environment: Portable to any flat, 32-bit environment. (Uses Win32 typedefs.) Requires ANSI C extensions: slash-slash comments, long external names. Revision History: 13-Sep-1991 JohnRo Created. 25-Sep-1991 JohnRo Fixed bug which caused ERROR_INVALID_PARAMETER (rcv.buf.len trunc'ed). 07-Oct-1991 JohnRo Made changes suggested by PC-LINT. --*/ // These must be included first: #include // IN, DWORD, etc. #include // DEVLEN, NET_API_STATUS, etc. // These may be included in any order: #include // API_ equates. #include // ERROR_ and NERR_ equates. #include #include // RxpFatalErrorCode(). #include // NetpKdPrint(()), FORMAT_ equates. #include // LPDESC. #include // REM16_, REM32_, REMSmb_ equates. #include // RxRemoteApi(). #include // My prototype(s). #include // NetpServiceStructureInfo(). NET_API_STATUS RxNetServiceControl ( IN LPTSTR UncServerName, IN LPTSTR Service, IN DWORD OpCode, IN DWORD Arg, OUT LPBYTE *BufPtr ) { const DWORD BufSize = 65535; LPDESC DataDesc16, DataDesc32, DataDescSmb; const DWORD Level = 2; // Implied by this API. LPSERVICE_INFO_2 serviceInfo2; NET_API_STATUS Status; NetpAssert(UncServerName != NULL); NetpAssert(*UncServerName != '\0'); Status = NetpServiceStructureInfo ( Level, PARMNUM_ALL, // want entire structure TRUE, // Want native sizes (actually don't care...) & DataDesc16, & DataDesc32, & DataDescSmb, NULL, // don't care about max size NULL, // don't care about fixed size NULL); // don't care about string size NetpAssert(Status == NERR_Success); Status = RxRemoteApi( API_WServiceControl, // API number UncServerName, REMSmb_NetServiceControl_P, // parm desc DataDesc16, DataDesc32, DataDescSmb, NULL, // no aux desc 16 NULL, // no aux desc 32 NULL, // no aux desc SMB ALLOCATE_RESPONSE, // flags: alloc response buffer for us // rest of API's arguments, in 32-bit LM2.x format: Service, OpCode, Arg, BufPtr, BufSize); // buffer size (ignored, mostly) if ((! RxpFatalErrorCode(Status)) && (Level == 2)) { serviceInfo2 = (LPSERVICE_INFO_2)*BufPtr; if (serviceInfo2 != NULL) { DWORD installState; serviceInfo2->svci2_display_name = serviceInfo2->svci2_name; // // if INSTALL or UNINSTALL is PENDING, then force the upper // bits to 0. This is to prevent the upper bits of the wait // hint from getting accidentally set. Downlevel should never // use more than FF for waithint. // installState = serviceInfo2->svci2_status & SERVICE_INSTALL_STATE; if ((installState == SERVICE_INSTALL_PENDING) || (installState == SERVICE_UNINSTALL_PENDING)) { serviceInfo2->svci2_code &= SERVICE_RESRV_MASK; } } } return(Status); } // RxNetServiceControl