Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1123 lines
27 KiB

  1. /************************************************************************
  2. Copyright (c) 2000 - 2000 Microsoft Corporation
  3. Module Name :
  4. qmgrlib.h
  5. Abstract :
  6. External header for library functions.
  7. Author :
  8. Revision History :
  9. ***********************************************************************/
  10. #pragma once
  11. #include<nt.h>
  12. #include<ntrtl.h>
  13. #include<nturtl.h>
  14. #include <windows.h>
  15. #include <sddl.h>
  16. #include <unknwn.h>
  17. #include <memory>
  18. #include <tchar.h>
  19. #include <strsafe.h>
  20. #include "bitsverp.h"
  21. // strsafe.h deprecates the shlwapi string functions
  22. //
  23. #define NO_SHLWAPI_STRFCNS
  24. //
  25. // Version Control
  26. //
  27. enum PLATFORM_PRODUCT_VERSION
  28. {
  29. WIN95_PLATFORM,
  30. WIN98_PLATFORM,
  31. #if defined( BITS_V12_ON_NT4 )
  32. NT4_PLATFORM,
  33. #endif
  34. WINDOWS2000_PLATFORM,
  35. WINDOWSXP_PLATFORM
  36. };
  37. extern PLATFORM_PRODUCT_VERSION g_PlatformVersion;
  38. extern bool bIsWin9x;
  39. BOOL DetectProductVersion();
  40. //
  41. // Limits
  42. //
  43. const size_t INT_DIGITS = 10;
  44. const size_t INT64_DIGITS = 20;
  45. const SIZE_T MAX_DISPLAYNAME = 255;
  46. const SIZE_T MAX_DESCRIPTION = 1023;
  47. const SIZE_T MAX_NOTIFY_CMD_LINE = 4000;
  48. const SIZE_T MAX_PROXYLIST = 32767;
  49. const SIZE_T MAX_PROXYBYPASSLIST = 32767;
  50. //
  51. // Metadata overhead
  52. //
  53. const SIZE_T METADATA_PADDING = 4096; // Padding on metadata for small changes such as timers
  54. const SIZE_T METADATA_PREALLOC_SIZE = 262144; // Size to prealloc before a change
  55. const SIZE_T METADATA_FOR_FILE = 4096; // Initial file size.
  56. const UINT MAX_GUID_CHARS=40;
  57. typedef WCHAR GUIDSTR[MAX_GUID_CHARS];
  58. template <class T>
  59. inline void SafeRelease( T * & p ) { if (NULL != (p)) { p->Release(); p = NULL; } }
  60. using namespace std;
  61. template<HANDLE InvalidValue=NULL>
  62. class auto_HANDLE
  63. {
  64. public:
  65. auto_HANDLE(HANDLE Handle = InvalidValue)
  66. : m_Handle(Handle) {}
  67. auto_HANDLE(auto_HANDLE<InvalidValue>& Other)
  68. : m_Handle(Other.release()) {}
  69. auto_HANDLE<InvalidValue>& operator=( HANDLE Handle )
  70. {
  71. if (InvalidValue != m_Handle)
  72. {
  73. CloseHandle(m_Handle);
  74. }
  75. m_Handle = Handle;
  76. return *this;
  77. }
  78. auto_HANDLE<InvalidValue>& operator=(auto_HANDLE<InvalidValue>& Other)
  79. {
  80. if (this != &Other)
  81. {
  82. m_Handle = Other.release();
  83. }
  84. return *this;
  85. }
  86. ~auto_HANDLE()
  87. {
  88. if (InvalidValue != m_Handle)
  89. CloseHandle(m_Handle);
  90. }
  91. HANDLE get() const
  92. {
  93. return m_Handle;
  94. }
  95. HANDLE * GetWritePointer()
  96. {
  97. return &m_Handle;
  98. }
  99. HANDLE release()
  100. {
  101. HANDLE Handle = m_Handle;
  102. m_Handle = InvalidValue;
  103. return Handle;
  104. }
  105. private:
  106. HANDLE m_Handle;
  107. };
  108. typedef auto_HANDLE<INVALID_HANDLE_VALUE> auto_FILE_HANDLE;
  109. class SidHandle
  110. {
  111. PSID m_pValue;
  112. long * m_pRefs;
  113. public:
  114. PSID operator->() { ASSERT( *m_pRefs > 0); return m_pValue; }
  115. SidHandle( PSID value=NULL ) : m_pValue( value ), m_pRefs( new long(1) )
  116. {
  117. }
  118. SidHandle( const SidHandle & r ) : m_pValue( r.m_pValue ), m_pRefs( r.m_pRefs )
  119. {
  120. InterlockedIncrement( m_pRefs );
  121. }
  122. ~SidHandle()
  123. {
  124. if ( InterlockedDecrement( m_pRefs ) == 0 )
  125. {
  126. delete m_pRefs;
  127. delete m_pValue;
  128. m_pRefs = NULL;
  129. m_pValue = NULL;
  130. }
  131. }
  132. SidHandle & operator=( const SidHandle & r );
  133. bool operator==( const SidHandle & r ) const
  134. {
  135. // this odd construction converts BOOL to bool.
  136. //
  137. return !!EqualSid( get(), r.get());
  138. }
  139. bool operator!=( const SidHandle & r ) const
  140. {
  141. return !((*this) == r);
  142. }
  143. PSID get() const { ASSERT( *m_pRefs > 0); return m_pValue; }
  144. };
  145. template<class T>
  146. class GenericStringHandle
  147. {
  148. struct StringData
  149. {
  150. SIZE_T m_Count;
  151. long m_Refs;
  152. T m_Data[1];
  153. };
  154. static StringData s_EmptyString;
  155. StringData *m_Value;
  156. void NewString( const T *String )
  157. {
  158. if ( !String )
  159. {
  160. m_Value = Alloc( 0 );
  161. return;
  162. }
  163. size_t Length = wcslen( String );
  164. m_Value = Alloc( Length );
  165. THROW_HRESULT( StringCchCopy( m_Value->m_Data, Length+1, String ));
  166. }
  167. static StringData * Alloc( SIZE_T max )
  168. {
  169. if (max == 0)
  170. {
  171. InterlockedIncrement( &s_EmptyString.m_Refs );
  172. return &s_EmptyString;
  173. }
  174. StringData * Value;
  175. Value = (StringData*) new char[sizeof(StringData)+(max*sizeof(T))];
  176. Value->m_Count = max;
  177. Value->m_Refs = 1;
  178. Value->m_Data[0] = L'\0';
  179. return Value;
  180. }
  181. StringData * RefIt() const
  182. {
  183. InterlockedIncrement( &m_Value->m_Refs );
  184. return m_Value;
  185. }
  186. void FreeIt()
  187. {
  188. if ( InterlockedDecrement( &m_Value->m_Refs ) == 0 )
  189. delete m_Value;
  190. }
  191. public:
  192. GenericStringHandle( const T *String = NULL )
  193. {
  194. NewString( String );
  195. }
  196. GenericStringHandle( const GenericStringHandle & Other ) :
  197. m_Value( Other.RefIt() )
  198. {
  199. }
  200. ~GenericStringHandle()
  201. {
  202. FreeIt();
  203. }
  204. GenericStringHandle & operator=( const GenericStringHandle & r )
  205. {
  206. FreeIt();
  207. m_Value = r.RefIt();
  208. return *this;
  209. }
  210. void operator=( const T * r )
  211. {
  212. FreeIt();
  213. NewString( r );
  214. }
  215. SIZE_T Size() const
  216. {
  217. return m_Value->m_Count;
  218. }
  219. operator const T *() const
  220. {
  221. return m_Value->m_Data;
  222. }
  223. //
  224. // Force a new copy of the data to be made.
  225. //
  226. GenericStringHandle Copy()
  227. {
  228. GenericStringHandle temp = m_Value->m_Data;
  229. return temp;
  230. }
  231. bool operator <( const GenericStringHandle & r ) const
  232. {
  233. if ( m_Value == r.m_Value)
  234. return false;
  235. return (wcscmp( this->m_Value->m_Data, r.m_Value->m_Data ) < 0);
  236. }
  237. T & operator[] ( const SIZE_T offset )
  238. {
  239. if (offset > Size())
  240. {
  241. THROW_HRESULT( E_INVALIDARG );
  242. }
  243. return m_Value->m_Data[ offset ];
  244. }
  245. void Truncate( SIZE_T max )
  246. {
  247. if (Size() <= max)
  248. {
  249. return;
  250. }
  251. //
  252. // Create the new value string.
  253. //
  254. StringData * NewValue = Alloc( max );
  255. StringCchCopy( NewValue->m_Data, max+1, m_Value->m_Data );
  256. //
  257. // Replace the current value with the new value.
  258. //
  259. FreeIt();
  260. m_Value = NewValue;
  261. }
  262. T * GetToken( T * CursorIn, const T Separators[], T ** CursorOut );
  263. };
  264. typedef GenericStringHandle<TCHAR> StringHandleT;
  265. typedef GenericStringHandle<CHAR> StringHandleA;
  266. typedef GenericStringHandle<WCHAR> StringHandle;
  267. inline WCHAR *
  268. GenericStringHandle<WCHAR>::GetToken( WCHAR * Cursor, const WCHAR Separators[], WCHAR **pCursor )
  269. {
  270. if (Cursor == NULL)
  271. {
  272. Cursor = m_Value->m_Data;
  273. }
  274. WCHAR * Token = NULL;
  275. if (Cursor < m_Value->m_Data + m_Value->m_Count)
  276. {
  277. Token = wcstok( Cursor, Separators );
  278. }
  279. if (Token)
  280. {
  281. *pCursor = Token + wcslen(Token) + 1;
  282. }
  283. else
  284. {
  285. *pCursor = m_Value->m_Data + m_Value->m_Count;
  286. }
  287. return Token;
  288. }
  289. typedef auto_ptr<WCHAR> CAutoStringW;
  290. typedef auto_ptr<TCHAR> CAutoStringT;
  291. typedef auto_ptr<char> CAutoStringA;
  292. typedef CAutoStringW CAutoString;
  293. //
  294. // PSID does not have an obvious ordering of the type required by the MAP classes.
  295. // So we define one here.
  296. //
  297. class CSidSorter
  298. {
  299. public:
  300. bool operator()( const SidHandle & psid1, const SidHandle & psid2 ) const;
  301. };
  302. PSID DuplicateSid( PSID _Sid );
  303. //---------------------------------------------
  304. enum FILE_DOWNLOAD_RESULT
  305. {
  306. QM_IN_PROGRESS,
  307. QM_FILE_ABORTED,
  308. QM_FILE_DONE,
  309. QM_FILE_TRANSIENT_ERROR,
  310. QM_FILE_FATAL_ERROR,
  311. QM_SERVER_FILE_CHANGED
  312. };
  313. /*
  314. The source field is divided into regions, like NTSTATUS and HRESULT codes.
  315. The lowest-order bit is bit 0; the highest is bit 31.
  316. bit 31: reserved, MBZ
  317. bits 30-29: component
  318. 00 = unknown
  319. 01 = queue manager
  320. 10 = transport
  321. 11 =
  322. bits 28-16: sub-component
  323. for queue manager: 0 = unknown
  324. 1 = local file handling
  325. 2 = queue management
  326. 3 = notification
  327. for transport: 0 = unknown
  328. 1 = HTTP
  329. 2 = HTTPS
  330. 3 = FTP
  331. 4 = SMB
  332. 5 = DAV
  333. bits 15-0: defined by sub-component
  334. for HTTP: 0 = unknown
  335. 1 = client connection
  336. 2 = server connection
  337. 3 = server file handling
  338. */
  339. #define COMPONENT_MASK (0x3 << 30)
  340. #define SUBCOMP_MASK (0x3fff << 16)
  341. #define FINAL_MASK (0xffff << 0 )
  342. #define COMPONENT_QMGR (0x1 << 30)
  343. #define COMPONENT_TRANS (0x2 << 30)
  344. #define SUBCOMP_QMGR_FILE (0x1 << 16)
  345. #define SUBCOMP_QMGR_QUEUE (0x2 << 16)
  346. #define SUBCOMP_QMGR_NOTIFY (0x3 << 16)
  347. #define SUBCOMP_QMGR_CACHE (0x4 << 16)
  348. #define SUBCOMP_TRANS_HTTP (COMPONENT_TRANS | (0x1 << 16))
  349. #define SUBCOMP_TRANS_HTTPS (COMPONENT_TRANS | (0x2 << 16))
  350. #define SUBCOMP_TRANS_FTP (COMPONENT_TRANS | (0x3 << 16))
  351. enum ERROR_SOURCE
  352. {
  353. SOURCE_NONE = 0,
  354. SOURCE_QMGR_FILE = (COMPONENT_QMGR | SUBCOMP_QMGR_FILE | 0x0),
  355. SOURCE_QMGR_QUEUE = (COMPONENT_QMGR | SUBCOMP_QMGR_QUEUE | 0x0),
  356. SOURCE_QMGR_NOTIFY = (COMPONENT_QMGR | SUBCOMP_QMGR_NOTIFY | 0x0),
  357. SOURCE_HTTP_UNKNOWN = (COMPONENT_TRANS | SUBCOMP_TRANS_HTTP | 0x0),
  358. SOURCE_HTTP_CLIENT_CONN = (COMPONENT_TRANS | SUBCOMP_TRANS_HTTP | 0x1),
  359. SOURCE_HTTP_SERVER = (COMPONENT_TRANS | SUBCOMP_TRANS_HTTP | 0x2),
  360. SOURCE_HTTP_SERVER_FILE = (COMPONENT_TRANS | SUBCOMP_TRANS_HTTP | 0x3),
  361. SOURCE_HTTP_SERVER_APP = (COMPONENT_TRANS | SUBCOMP_TRANS_HTTP | 0x4)
  362. };
  363. enum ERROR_STYLE
  364. {
  365. ERROR_STYLE_NONE = 0,
  366. ERROR_STYLE_HRESULT = 1,
  367. ERROR_STYLE_WIN32 = 2,
  368. ERROR_STYLE_HTTP = 3
  369. };
  370. struct QMErrInfo
  371. {
  372. FILE_DOWNLOAD_RESULT result;
  373. UINT64 Code;
  374. ERROR_STYLE Style;
  375. ERROR_SOURCE Source;
  376. wchar_t * Description;
  377. QMErrInfo()
  378. {
  379. result = QM_FILE_DONE;
  380. Clear();
  381. }
  382. QMErrInfo(
  383. ERROR_SOURCE Source,
  384. ERROR_STYLE Style,
  385. UINT64 Code,
  386. char * comment = 0
  387. );
  388. void
  389. Set(
  390. ERROR_SOURCE Source,
  391. ERROR_STYLE Style,
  392. UINT64 Code,
  393. char * comment = 0
  394. );
  395. void Clear()
  396. {
  397. Source = SOURCE_NONE;
  398. Style = ERROR_STYLE_NONE;
  399. Code = 0;
  400. Description = NULL;
  401. }
  402. bool IsSet()
  403. {
  404. return (Style != ERROR_STYLE_NONE);
  405. }
  406. void Log();
  407. bool operator==( const QMErrInfo & err )
  408. {
  409. if (Source == err.Source &&
  410. Style == err.Style &&
  411. Code == err.Code)
  412. {
  413. return true;
  414. }
  415. return false;
  416. }
  417. bool operator!=( const QMErrInfo & err )
  418. {
  419. if (*this == err)
  420. {
  421. return false;
  422. }
  423. return true;
  424. }
  425. };
  426. //---------------------------------------------
  427. const UINT64 NanoSec100PerSec = 10000000; //no of 100 nanosecs per sec
  428. const TCHAR * const C_BITS_USER_AGENT = _T("Microsoft BITS/") VER_PRODUCTVERSION_WSTRING;
  429. // Registry keys
  430. const TCHAR * const C_QMGR_REG_KEY = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\BITS");
  431. // Registry Value(REG_SZ).
  432. // Point to where to load the upgraded DLL
  433. const TCHAR * const C_QMGR_SERVICEDLL = _T("ServiceDLL");
  434. // Registry Values(REG_DWORD/seconds)
  435. const TCHAR * const C_QMGR_STATE_INDEX = _T("StateIndex");
  436. const TCHAR * const C_QMGR_JOB_INACTIVITY_TIMEOUT = _T("JobInactivityTimeout");
  437. const TCHAR * const C_QMGR_TIME_QUANTA_LENGTH = _T("TimeQuantaLength");
  438. const TCHAR * const C_QMGR_NO_PROGRESS_TIMEOUT = _T("JobNoProgressTimeout");
  439. const TCHAR * const C_QMGR_MINIMUM_RETRY_DELAY = _T("JobMinimumRetryDelay");
  440. // Logging registry Values(REG_DWORD)
  441. const TCHAR * const C_QMGR_LOGFILE_SIZE = _T("LogFileSize"); // In MB
  442. const TCHAR * const C_QMGR_LOGFILE_FLAGS = _T("LogFileFlags");
  443. const TCHAR * const C_QMGR_LOGFILE_MINMEMORY = _T("LogFileMinMemory"); // In MB
  444. // default values
  445. const UINT32 C_QMGR_JOB_INACTIVITY_TIMEOUT_DEFAULT = (60ui64 * 60ui64 * 24ui64 * 90ui64); // 90 days
  446. const UINT32 C_QMGR_TIME_QUANTA_LENGTH_DEFAULT = (5 * 60); // 5 minutes
  447. const UINT32 C_QMGR_NO_PROGRESS_TIMEOUT_DEFAULT = (14 * 24 * 60 * 60); //14 days
  448. const UINT32 C_QMGR_MINIMUM_RETRY_DELAY_DEFAULT = (10 * 60); // ten minutes
  449. // Logging default values
  450. const UINT32 C_QMGR_LOGFILE_SIZE_DEFAULT = 1;
  451. #if DBG
  452. // Debug/Non-ship mode
  453. // everything except 0x010 - Ref Counts and 0x020 - State File
  454. //
  455. const UINT32 C_QMGR_LOGFILE_FLAGS_DEFAULT = 0xFFCF;
  456. #else
  457. const UINT32 C_QMGR_LOGFILE_FLAGS_DEFAULT = 0;
  458. #endif
  459. const UINT32 C_QMGR_LOGFILE_MINMEMORY_DEFAULT = 120;
  460. // Policy keys
  461. const TCHAR * const C_QMGR_POLICY_REG_KEY = _T("Software\\Policies\\Microsoft\\Windows\\BITS");
  462. // Policy values
  463. const TCHAR * const C_QMGR_POLICY_JOB_INACTIVITY_TIMEOUT = _T("JobInactivityTimeout");
  464. // Special directories
  465. const TCHAR * const C_QMGR_DIRECTORY = _T("\\Microsoft\\Network\\Downloader\\");
  466. const wchar_t NullString[] = L"(null)";
  467. // cfreg.cpp - Functions to handle registry keys
  468. HRESULT GetRegStringValue(LPCTSTR lpszValueName, LPTSTR lpszBuffer, int iBufferSize);
  469. HRESULT SetRegStringValue(LPCTSTR lpszValueName, LPCTSTR lpszNewValue);
  470. HRESULT DeleteRegStringValue(LPCTSTR lpszValueName);
  471. HRESULT GetRegDWordValue(LPCTSTR lpszValueName, LPDWORD pdwValue);
  472. HRESULT SetRegDWordValue(LPCTSTR lpszValueName, DWORD dwValue);
  473. // service.cxx
  474. HRESULT SetServiceStartup( bool bAutoStart );
  475. // helpers.cpp
  476. BOOL QMgrFileExists(LPCTSTR szFile);
  477. FILETIME GetTimeAfterDelta( UINT64 uDelta );
  478. BOOL IsConnected();
  479. LPCWSTR TruncateString( LPCWSTR String, SIZE_T MaxLength, auto_ptr<WCHAR> & AutoPointer );
  480. //
  481. // The standard error class. This is the only type of C++ exception that
  482. // BITS functions should throw.
  483. //
  484. class ComError
  485. {
  486. HRESULT m_error;
  487. public:
  488. ComError(HRESULT NewErrorCode) : m_error ( NewErrorCode ) {}
  489. HRESULT Error() { return m_error; }
  490. };
  491. inline void THROW_HRESULT( HRESULT hr )
  492. {
  493. if (FAILED(hr))
  494. {
  495. throw ComError( hr );
  496. }
  497. }
  498. inline void ThrowLastError()
  499. {
  500. throw ComError( HRESULT_FROM_WIN32( GetLastError() ));
  501. }
  502. ////////////////////////////////////////////////////////////////////////
  503. //
  504. // Global info class
  505. //
  506. ////////////////////////////////////////////////////////////////////////
  507. class GlobalInfo
  508. {
  509. private:
  510. GlobalInfo( TCHAR *QmgrDirectory,
  511. LARGE_INTEGER PerfamceCounterFrequency,
  512. HKEY QmgrRegistryRoot,
  513. UINT64 JobInactivityTimeout,
  514. UINT64 TimeQuantaLength,
  515. UINT32 DefaultNoProgressTimeout,
  516. UINT32 DefaultMinimumRetryDelay,
  517. SECURITY_DESCRIPTOR *MetadataSecurityDescriptor,
  518. DWORD MetadataSecurityDescriptorLength,
  519. SidHandle AdministratorsSid,
  520. SidHandle LocalSystemSid,
  521. SidHandle NetworkUsersSid
  522. );
  523. ~GlobalInfo();
  524. public:
  525. static DWORD RegGetDWORD( HKEY hKey, const TCHAR * pValue, DWORD dwDefault );
  526. const TCHAR * const m_QmgrDirectory;
  527. const LARGE_INTEGER m_PerformanceCounterFrequency;
  528. const HKEY m_QmgrRegistryRoot;
  529. const UINT64 m_JobInactivityTimeout;
  530. const UINT64 m_TimeQuantaLength;
  531. const UINT32 m_DefaultNoProgressTimeout;
  532. const UINT32 m_DefaultMinimumRetryDelay;
  533. const SECURITY_DESCRIPTOR * const m_MetadataSecurityDescriptor;
  534. const DWORD m_MetadataSecurityDescriptorLength;
  535. const SidHandle m_AdministratorsSid;
  536. const SidHandle m_LocalSystemSid;
  537. const SidHandle m_NetworkUsersSid;
  538. static HRESULT Init(void);
  539. static HRESULT Uninit(void);
  540. };
  541. extern class GlobalInfo *g_GlobalInfo;
  542. //
  543. // variables to keep track of service state
  544. //
  545. enum MANAGER_STATE
  546. {
  547. MANAGER_INACTIVE,
  548. MANAGER_ACTIVE,
  549. MANAGER_TERMINATING
  550. };
  551. extern MANAGER_STATE g_ServiceState;
  552. extern long g_ServiceInstance;
  553. extern DWORD g_LastServiceControl;
  554. //
  555. // Jump to a label on failure. Assumes an HRESULT "hr" and a label "Cleanup".
  556. //
  557. #define CLEANUP_ON_FAILURE( x ) \
  558. hr = x; \
  559. if (FAILED(hr)) \
  560. { \
  561. goto Cleanup; \
  562. }
  563. #define RETURN_HRESULT( x ) \
  564. { \
  565. HRESULT _hr_ = (x); \
  566. if (FAILED(_hr_)) \
  567. { \
  568. return _hr_; \
  569. } \
  570. }
  571. #define GFA_FAILED DWORD(-1)
  572. inline BOOL FileExists( LPWSTR szFile )
  573. {
  574. DWORD dwAttr = GetFileAttributes( szFile );
  575. if( GFA_FAILED == dwAttr )
  576. return FALSE;
  577. return (BOOL)( !(dwAttr & FILE_ATTRIBUTE_DIRECTORY) );
  578. }
  579. inline UINT64 FILETIMEToUINT64( const FILETIME & FileTime )
  580. {
  581. ULARGE_INTEGER LargeInteger;
  582. LargeInteger.HighPart = FileTime.dwHighDateTime;
  583. LargeInteger.LowPart = FileTime.dwLowDateTime;
  584. return LargeInteger.QuadPart;
  585. }
  586. inline FILETIME UINT64ToFILETIME( UINT64 Int64Value )
  587. {
  588. ULARGE_INTEGER LargeInteger;
  589. LargeInteger.QuadPart = Int64Value;
  590. FILETIME FileTime;
  591. FileTime.dwHighDateTime = LargeInteger.HighPart;
  592. FileTime.dwLowDateTime = LargeInteger.LowPart;
  593. return FileTime;
  594. }
  595. //------------------------------------------------------------------------
  596. //
  597. // NT security
  598. //
  599. //------------------------------------------------------------------------
  600. SidHandle GetThreadClientSid();
  601. HRESULT
  602. ImpersonateSid(
  603. PSID sid
  604. );
  605. BOOL
  606. SidToString(
  607. PSID sid,
  608. wchar_t buffer[],
  609. USHORT bytes
  610. );
  611. HRESULT
  612. IsRemoteUser();
  613. HRESULT
  614. IsAdministratorUser();
  615. HRESULT
  616. DenyRemoteAccess();
  617. HRESULT
  618. DenyNonAdminAccess();
  619. PSID DuplicateSid( PSID _Sid );
  620. //
  621. // Copy of RtlSecureZeroMemory() from the .Net Server tree.
  622. //
  623. FORCEINLINE
  624. PVOID
  625. MySecureZeroMemory(
  626. IN PVOID ptr,
  627. IN SIZE_T cnt
  628. )
  629. {
  630. volatile char *vptr = (volatile char *)ptr;
  631. while (cnt) {
  632. *vptr = 0;
  633. vptr++;
  634. cnt--;
  635. }
  636. return ptr;
  637. }
  638. //
  639. // allows CreateInstanceInSession to choose an arbitrary session.
  640. //
  641. #define ANY_SESSION DWORD(-1)
  642. HRESULT
  643. CreateInstanceInSession(
  644. REFCLSID clsid,
  645. REFIID iid,
  646. DWORD session,
  647. void ** pif
  648. );
  649. HRESULT
  650. SetStaticCloaking(
  651. IUnknown *pUnk
  652. );
  653. HRESULT
  654. ApplyIdentityToInterface(
  655. IUnknown *pUnk,
  656. PSID sid
  657. );
  658. struct IBackgroundCopyCallback;
  659. struct IBackgroundCopyCallback1;
  660. HRESULT
  661. CreateUserCallback(
  662. CLSID clsid,
  663. PSID sid,
  664. IBackgroundCopyCallback **pICB
  665. );
  666. HRESULT
  667. CreateOldUserCallback(
  668. CLSID clsid,
  669. PSID sid,
  670. IBackgroundCopyCallback1 **pICB
  671. );
  672. HRESULT
  673. SessionLogonCallback(
  674. DWORD SessionId
  675. );
  676. HRESULT
  677. SessionLogoffCallback(
  678. DWORD SessionId
  679. );
  680. DWORD
  681. DeviceEventCallback(
  682. DWORD dwEventType,
  683. LPVOID lpEventData
  684. );
  685. BOOL Log_Init();
  686. void Log_StartLogger();
  687. void Log_Close();
  688. HRESULT GlobalInit();
  689. HRESULT GlobalUninit();
  690. HRESULT InitQmgr();
  691. HRESULT UninitQmgr();
  692. const GUID BITSCtrlGuid = {0x4a8aaa94,0xcfc4,0x46a7,{0x8e,0x4e,0x17,0xbc,0x45,0x60,0x8f,0x0a}};
  693. #define WPP_CONTROL_GUIDS \
  694. WPP_DEFINE_CONTROL_GUID(CtlGuid,(4a8aaa94,cfc4,46a7,8e4e,17bc45608f0a), \
  695. WPP_DEFINE_BIT(LogFlagInfo) \
  696. WPP_DEFINE_BIT(LogFlagWarning) \
  697. WPP_DEFINE_BIT(LogFlagError) \
  698. WPP_DEFINE_BIT(LogFlagFunction) \
  699. WPP_DEFINE_BIT(LogFlagRefCount) \
  700. WPP_DEFINE_BIT(LogFlagSerialize) \
  701. WPP_DEFINE_BIT(LogFlagDownload) \
  702. WPP_DEFINE_BIT(LogFlagTask) \
  703. WPP_DEFINE_BIT(LogFlagLock) \
  704. WPP_DEFINE_BIT(LogFlagService) \
  705. )
  706. #define LogLevelEnabled(flags) WPP_LEVEL_ENABLED(flags) \
  707. LONG ExternalFuncExceptionFilter( struct _EXCEPTION_POINTERS *ExceptionInfo );
  708. //
  709. // We keep track of COM calls because we can't delete our objects at shutdown
  710. // until all the active calls have stopped referring to them.
  711. //
  712. extern long g_cCalls;
  713. inline void IncrementCallCount()
  714. {
  715. InterlockedIncrement(&g_cCalls);
  716. }
  717. inline void DecrementCallCount()
  718. {
  719. InterlockedDecrement(&g_cCalls);
  720. }
  721. inline long ActiveCallCount()
  722. {
  723. return g_cCalls;
  724. }
  725. //
  726. // A simple helper class to keep track of our call count.
  727. //
  728. class DispatchedCall
  729. {
  730. public:
  731. DispatchedCall() { IncrementCallCount(); }
  732. ~DispatchedCall() { DecrementCallCount(); }
  733. };
  734. //
  735. // Each member function of our public COM interfaces has an external
  736. // and an internal version. The external version is simply
  737. // {
  738. // EXTERNAL_FUNC_WRAP( internal-version );
  739. // }
  740. // This captures any exceptions in a way that can be reported by the OfficeWatson
  741. // error-reporting apparatus.
  742. // It also checks for service shutdown.
  743. //
  744. HRESULT
  745. CheckServerInstance(
  746. long ObjectServiceInstance
  747. );
  748. #define EXTERNAL_FUNC_WRAP( call_parent ) \
  749. \
  750. __try \
  751. { \
  752. RETURN_HRESULT( CheckServerInstance( m_ServiceInstance )); \
  753. \
  754. HRESULT hr = call_parent ; \
  755. \
  756. DecrementCallCount(); \
  757. return hr; \
  758. } \
  759. __except( ExternalFuncExceptionFilter( GetExceptionInformation() ) ) \
  760. { \
  761. DecrementCallCount(); \
  762. return RPC_E_SERVERFAULT; \
  763. } \
  764. //
  765. // IUnknown member functions use these alternate macros.
  766. //
  767. #define BEGIN_EXTERNAL_FUNC \
  768. __try \
  769. { \
  770. #define END_EXTERNAL_FUNC \
  771. } \
  772. __except( ExternalFuncExceptionFilter( GetExceptionInformation() ) ) \
  773. { \
  774. return RPC_E_SERVERFAULT; \
  775. } \
  776. StringHandle
  777. BITSCrackFileName(
  778. const WCHAR * RawFileName,
  779. StringHandle & ReturnFileName
  780. );
  781. StringHandle
  782. BITSCreateTempFile(
  783. StringHandle Directory
  784. );
  785. HRESULT
  786. BITSCheckFileWritability(
  787. LPCWSTR name
  788. );
  789. StringHandle
  790. CombineUrl(
  791. LPCWSTR BaseUrl,
  792. LPCWSTR RelativeUrl,
  793. DWORD Flags
  794. );
  795. LPWSTR MidlCopyString( LPCWSTR source, size_t Length = -1);
  796. inline LPWSTR MidlCopyString( StringHandle source )
  797. {
  798. return MidlCopyString( source, source.Size()+1 );
  799. }
  800. LPWSTR CopyString( LPCWSTR source, size_t Length = -1);
  801. inline LPWSTR CopyString( StringHandle source )
  802. {
  803. return CopyString( source, source.Size()+1 );
  804. }
  805. inline bool operator==( const FILETIME left, const FILETIME right )
  806. {
  807. return ((left.dwLowDateTime == right.dwLowDateTime) &&
  808. (left.dwHighDateTime == right.dwHighDateTime));
  809. }
  810. inline bool operator!=( const FILETIME left, const FILETIME right )
  811. {
  812. return !(left == right);
  813. }
  814. bool IsServiceShuttingDown();
  815. bool IsAnyDebuggerPresent();
  816. bool InitCompilerLibrary();
  817. bool UninitCompilerLibrary();
  818. #if defined(BITS_V12_ON_NT4)
  819. extern ULONG BITSFlags;
  820. void Log( const CHAR *Prefix, const CHAR *Format, va_list ArgList );
  821. const DWORD LogFlagInfo = 0;
  822. const DWORD LogFlagWarning = 1;
  823. const DWORD LogFlagError = 2;
  824. const DWORD LogFlagFunction = 4;
  825. const DWORD LogFlagRefCount = 8;
  826. const DWORD LogFlagRef = LogFlagRefCount;
  827. const DWORD LogFlagSerialize = 16;
  828. const DWORD LogFlagSerial = LogFlagSerialize;
  829. const DWORD LogFlagDownload = 32;
  830. const DWORD LogFlagDl = LogFlagDownload;
  831. const DWORD LogFlagTask = 64;
  832. const DWORD LogFlagLock = 128;
  833. const DWORD LogFlagService = 256;
  834. const DWORD LogFlagPublicApiBegin = LogFlagFunction;
  835. const DWORD LogFlagPublicApiEnd = LogFlagFunction;
  836. #define DEFINE_SIMPLE_LOG_FUNCT( flag, prefix ) \
  837. inline void Log##flag##( const char *format, ...) \
  838. { \
  839. if ( ! ( BITSFlags & ~LogFlag##flag ) ) \
  840. return; \
  841. va_list marker; \
  842. va_start( marker, format ); \
  843. Log( prefix, format, marker ); \
  844. } \
  845. DEFINE_SIMPLE_LOG_FUNCT( Info, " INFO :" )
  846. DEFINE_SIMPLE_LOG_FUNCT( Warning, " WARNING :" )
  847. DEFINE_SIMPLE_LOG_FUNCT( Error, " ERROR :" )
  848. DEFINE_SIMPLE_LOG_FUNCT( PublicApiBegin, " FUNC_BEGIN :" )
  849. DEFINE_SIMPLE_LOG_FUNCT( PublicApiEnd, " FUNC_END :" )
  850. DEFINE_SIMPLE_LOG_FUNCT( Ref, " REF :" )
  851. DEFINE_SIMPLE_LOG_FUNCT( Lock, " LOCK :" )
  852. DEFINE_SIMPLE_LOG_FUNCT( Task, " TASK :" )
  853. DEFINE_SIMPLE_LOG_FUNCT( Service, " SERVICE :" )
  854. DEFINE_SIMPLE_LOG_FUNCT( Dl, " DOWNLOAD :" )
  855. DEFINE_SIMPLE_LOG_FUNCT( Serial, " SERIALIZE :" )
  856. BOOL
  857. BITSAltGetFileSizeEx(
  858. HANDLE hFile, // handle to file
  859. PLARGE_INTEGER lpFileSize // file size
  860. );
  861. BOOL
  862. BITSAltSetFilePointerEx(
  863. HANDLE hFile, // handle to file
  864. LARGE_INTEGER liDistanceToMove, // bytes to move pointer
  865. PLARGE_INTEGER lpNewFilePointer, // new file pointer
  866. DWORD dwMoveMethod // starting point
  867. );
  868. BOOL
  869. BITSAltConvertSidToStringSidW(
  870. IN PSID Sid,
  871. OUT LPWSTR *StringSid
  872. );
  873. BOOL
  874. BITSAltConvertStringSidToSidW(
  875. IN LPCWSTR StringSid,
  876. OUT PSID *Sid
  877. );
  878. BOOL
  879. BITSAltCheckTokenMembership(
  880. IN HANDLE TokenHandle OPTIONAL,
  881. IN PSID SidToCheck,
  882. OUT PBOOL IsMember
  883. );
  884. SERVICE_STATUS_HANDLE
  885. BITSAltRegisterServiceCtrlHandlerExW(
  886. LPCTSTR lpServiceName, // name of service
  887. LPHANDLER_FUNCTION_EX lpHandlerProc, // handler function
  888. LPVOID lpContext // user data
  889. );
  890. #define GetFileSizeEx BITSAltGetFileSizeEx
  891. #define SetFilePointerEx BITSAltSetFilePointerEx
  892. #define ConvertSidToStringSidW BITSAltConvertSidToStringSidW
  893. #define ConvertStringSidToSidW BITSAltConvertStringSidToSidW
  894. #define CheckTokenMembership BITSAltCheckTokenMembership
  895. #define RegisterServiceCtrlHandlerExW BITSAltRegisterServiceCtrlHandlerExW
  896. #endif