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.

894 lines
18 KiB

  1. /*++
  2. Copyright (c) 1991 Microsoft Corporation
  3. Module Name:
  4. winsstub.c
  5. Abstract:
  6. Client stubs of the WINS server service APIs.
  7. Author:
  8. Pradeep Bahl (pradeepb) Apr-1993
  9. Environment:
  10. User Mode - Win32
  11. Revision History:
  12. --*/
  13. #include "windows.h"
  14. #include "rpc.h"
  15. #include "winsif.h"
  16. #include "esent.h"
  17. #include "winscnst.h"
  18. //#include "winsintf.h"
  19. //
  20. // prototypes
  21. //
  22. DWORD
  23. WinsRestoreC(
  24. LPBYTE pBackupPath,
  25. DbVersion Version
  26. );
  27. DWORD
  28. WinsRecordAction(
  29. WINSIF2_HANDLE ServerHdl,
  30. PWINSINTF_RECORD_ACTION_T *ppRecAction
  31. )
  32. {
  33. DWORD status;
  34. RpcTryExcept {
  35. status = R_WinsRecordAction(
  36. ServerHdl,
  37. ppRecAction
  38. );
  39. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  40. status = RpcExceptionCode();
  41. } RpcEndExcept
  42. return status;
  43. }
  44. DWORD
  45. WinsStatus(
  46. WINSIF2_HANDLE ServerHdl,
  47. WINSINTF_CMD_E Cmd_e,
  48. PWINSINTF_RESULTS_T pResults
  49. )
  50. {
  51. DWORD status;
  52. RpcTryExcept {
  53. status = R_WinsStatus(
  54. //pWinsAddStr,
  55. ServerHdl,
  56. Cmd_e,
  57. pResults
  58. );
  59. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  60. status = RpcExceptionCode();
  61. } RpcEndExcept
  62. return status;
  63. }
  64. DWORD
  65. WinsStatusNew(
  66. WINSIF2_HANDLE ServerHdl,
  67. WINSINTF_CMD_E Cmd_e,
  68. PWINSINTF_RESULTS_NEW_T pResults
  69. )
  70. {
  71. DWORD status;
  72. RpcTryExcept {
  73. status = R_WinsStatusNew(
  74. ServerHdl,
  75. Cmd_e,
  76. pResults
  77. );
  78. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  79. status = RpcExceptionCode();
  80. } RpcEndExcept
  81. return status;
  82. }
  83. DWORD
  84. WinsStatusWHdl(
  85. WINSIF_HANDLE ServerHdl,
  86. WINSINTF_CMD_E Cmd_e,
  87. PWINSINTF_RESULTS_NEW_T pResults
  88. )
  89. {
  90. DWORD status;
  91. RpcTryExcept {
  92. status = R_WinsStatusWHdl(
  93. ServerHdl,
  94. Cmd_e,
  95. pResults
  96. );
  97. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  98. status = RpcExceptionCode();
  99. } RpcEndExcept
  100. return status;
  101. }
  102. DWORD
  103. WinsTrigger(
  104. WINSIF2_HANDLE ServerHdl,
  105. PWINSINTF_ADD_T pWinsAdd,
  106. WINSINTF_TRIG_TYPE_E TrigType_e
  107. )
  108. {
  109. DWORD status;
  110. RpcTryExcept {
  111. status = R_WinsTrigger(
  112. ServerHdl,
  113. pWinsAdd,
  114. TrigType_e
  115. );
  116. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  117. status = RpcExceptionCode();
  118. } RpcEndExcept
  119. return status;
  120. }
  121. DWORD
  122. WinsDoStaticInit(
  123. WINSIF2_HANDLE ServerHdl,
  124. LPWSTR pDataFilePath,
  125. DWORD fDel
  126. )
  127. {
  128. DWORD status;
  129. RpcTryExcept {
  130. status = R_WinsDoStaticInit(
  131. ServerHdl,
  132. pDataFilePath, fDel);
  133. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  134. status = RpcExceptionCode();
  135. } RpcEndExcept
  136. return status;
  137. }
  138. DWORD
  139. WinsDoScavenging(
  140. WINSIF2_HANDLE ServerHdl
  141. )
  142. {
  143. DWORD status;
  144. RpcTryExcept {
  145. status = R_WinsDoScavenging(
  146. ServerHdl
  147. );
  148. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  149. status = RpcExceptionCode();
  150. } RpcEndExcept
  151. return status;
  152. }
  153. DWORD
  154. WinsDoScavengingNew(
  155. WINSIF2_HANDLE ServerHdl,
  156. PWINSINTF_SCV_REQ_T pScvReq
  157. )
  158. {
  159. DWORD status;
  160. RpcTryExcept {
  161. status = R_WinsDoScavengingNew(
  162. ServerHdl,
  163. pScvReq);
  164. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  165. status = RpcExceptionCode();
  166. } RpcEndExcept
  167. return status;
  168. }
  169. DWORD
  170. WinsGetDbRecs(
  171. WINSIF2_HANDLE ServerHdl,
  172. PWINSINTF_ADD_T pWinsAdd,
  173. WINSINTF_VERS_NO_T MinVersNo,
  174. WINSINTF_VERS_NO_T MaxVersNo,
  175. PWINSINTF_RECS_T pRecs
  176. )
  177. {
  178. DWORD status;
  179. RpcTryExcept {
  180. status = R_WinsGetDbRecs(
  181. ServerHdl,
  182. pWinsAdd, MinVersNo, MaxVersNo, pRecs);
  183. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  184. status = RpcExceptionCode();
  185. } RpcEndExcept
  186. return status;
  187. }
  188. DWORD
  189. WinsTerm(
  190. handle_t ServerHdl,
  191. short fAbruptTerm
  192. )
  193. {
  194. DWORD status;
  195. RpcTryExcept {
  196. status = R_WinsTerm(
  197. ServerHdl,
  198. fAbruptTerm);
  199. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  200. status = RpcExceptionCode();
  201. } RpcEndExcept
  202. return status;
  203. }
  204. DWORD
  205. WinsBackup(
  206. WINSIF2_HANDLE ServerHdl,
  207. LPBYTE pBackupPath,
  208. short fIncremental
  209. )
  210. {
  211. DWORD status;
  212. RpcTryExcept {
  213. status = R_WinsBackup(
  214. ServerHdl,
  215. pBackupPath, fIncremental);
  216. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  217. status = RpcExceptionCode();
  218. } RpcEndExcept
  219. return status;
  220. }
  221. DWORD
  222. WinsDelDbRecs(
  223. WINSIF2_HANDLE ServerHdl,
  224. PWINSINTF_ADD_T pWinsAdd,
  225. WINSINTF_VERS_NO_T MinVersNo,
  226. WINSINTF_VERS_NO_T MaxVersNo
  227. )
  228. {
  229. DWORD status;
  230. RpcTryExcept {
  231. status = R_WinsDelDbRecs(
  232. ServerHdl,
  233. pWinsAdd, MinVersNo, MaxVersNo);
  234. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  235. status = RpcExceptionCode();
  236. } RpcEndExcept
  237. return status;
  238. }
  239. DWORD
  240. WinsPullRange(
  241. WINSIF2_HANDLE ServerHdl,
  242. PWINSINTF_ADD_T pWinsAdd,
  243. PWINSINTF_ADD_T pOwnAdd,
  244. WINSINTF_VERS_NO_T MinVersNo,
  245. WINSINTF_VERS_NO_T MaxVersNo
  246. )
  247. {
  248. DWORD status;
  249. RpcTryExcept {
  250. status = R_WinsPullRange(
  251. ServerHdl,
  252. pWinsAdd, pOwnAdd, MinVersNo, MaxVersNo);
  253. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  254. status = RpcExceptionCode();
  255. } RpcEndExcept
  256. return status;
  257. }
  258. DWORD
  259. WinsSetPriorityClass(
  260. WINSIF2_HANDLE ServerHdl,
  261. WINSINTF_PRIORITY_CLASS_E PrCls_e
  262. )
  263. {
  264. DWORD status;
  265. RpcTryExcept {
  266. status = R_WinsSetPriorityClass(
  267. ServerHdl,
  268. PrCls_e);
  269. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  270. status = RpcExceptionCode();
  271. } RpcEndExcept
  272. return status;
  273. }
  274. DWORD
  275. WinsResetCounters(
  276. WINSIF2_HANDLE ServerHdl
  277. )
  278. {
  279. DWORD status;
  280. RpcTryExcept {
  281. status = R_WinsResetCounters(
  282. ServerHdl
  283. );
  284. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  285. status = RpcExceptionCode();
  286. } RpcEndExcept
  287. return status;
  288. }
  289. DWORD
  290. WinsRestoreEx(
  291. LPBYTE pBackupPath,
  292. DbVersion Version
  293. )
  294. {
  295. return(WinsRestoreC(pBackupPath, Version));
  296. }
  297. DWORD
  298. WinsRestore(
  299. LPBYTE pBackupPath
  300. )
  301. {
  302. return(WinsRestoreC(pBackupPath, DbVersion5 ));
  303. }
  304. DWORD
  305. ConvertUnicodeStringToAscii(
  306. LPWSTR pUnicodeString,
  307. LPBYTE pAsciiString,
  308. DWORD MaxSz
  309. )
  310. {
  311. DWORD RetVal;
  312. RetVal = WideCharToMultiByte(
  313. CP_ACP,
  314. 0,
  315. pUnicodeString,
  316. -1,
  317. pAsciiString,
  318. MaxSz,
  319. NULL,
  320. NULL
  321. );
  322. if (0 == RetVal ) {
  323. return GetLastError();
  324. } else {
  325. return ERROR_SUCCESS;
  326. }
  327. }
  328. DWORD
  329. WinsReadLogPath(
  330. PCHAR *pLogPath
  331. )
  332. {
  333. DWORD Error;
  334. static TCHAR Buf[WINSINTF_MAX_NAME_SIZE];
  335. static TCHAR ExpandBuf[WINSINTF_MAX_NAME_SIZE];
  336. static char AsciiBuf[WINSINTF_MAX_NAME_SIZE];
  337. WCHAR *pTempPath,*pExpandTempPath;
  338. HKEY sParamKey;
  339. DWORD ValTyp;
  340. DWORD Sz;
  341. #define WINS_PARAM_KEY TEXT("System\\CurrentControlSet\\Services\\Wins\\Parameters")
  342. #define DEFAULT_LOG_FILE_PATH TEXT("%SystemRoot%\\System32\\wins")
  343. Error = RegOpenKeyEx(
  344. HKEY_LOCAL_MACHINE,
  345. WINS_PARAM_KEY,
  346. 0 ,
  347. KEY_READ,
  348. &sParamKey
  349. );
  350. if (ERROR_SUCCESS != Error) {
  351. return Error;
  352. }
  353. pTempPath = Buf;
  354. Error = RegQueryValueEx(
  355. sParamKey,
  356. WINSCNF_LOG_FILE_PATH_NM,
  357. NULL, //reserved; must be NULL
  358. &ValTyp,
  359. (LPBYTE)pTempPath,
  360. &Sz
  361. );
  362. if (ERROR_SUCCESS != Error || pTempPath[0] == L'\0') {
  363. pTempPath = DEFAULT_LOG_FILE_PATH;
  364. }
  365. pExpandTempPath = ExpandBuf;
  366. Error = ExpandEnvironmentStrings(
  367. pTempPath,
  368. pExpandTempPath,
  369. WINSINTF_MAX_NAME_SIZE);
  370. if (0 == Error || Error > WINSINTF_MAX_NAME_SIZE) {
  371. RegCloseKey(sParamKey);
  372. return GetLastError();
  373. }
  374. *pLogPath = AsciiBuf;
  375. Error = ConvertUnicodeStringToAscii(
  376. pExpandTempPath,
  377. *pLogPath,
  378. WINSINTF_MAX_NAME_SIZE
  379. );
  380. RegCloseKey(sParamKey);
  381. return Error;
  382. }
  383. DWORD
  384. WinsRestoreC(
  385. LPBYTE pBackupPath,
  386. DbVersion Version
  387. )
  388. /*++
  389. Routine Description:
  390. This is not an RPC function. It is provided to do a restore of
  391. the database.
  392. Arguments:
  393. pBackupPath - Path to the backup directory
  394. Externals Used:
  395. None
  396. Return Value:
  397. Success status codes --
  398. Error status codes --
  399. Error Handling:
  400. Called by:
  401. Side Effects:
  402. Comments:
  403. None
  404. --*/
  405. {
  406. JET_ERR JetRetStat;
  407. HMODULE hExtension;
  408. FARPROC fRestoreFn;
  409. FARPROC fSetSystemParamFn;
  410. DWORD RetStat = WINSINTF_SUCCESS;
  411. DWORD ProcId = 0x9C; //ordinal value of JetRestore
  412. LPCSTR RestoreProcName;
  413. LPCSTR SetSystemParamProcName;
  414. BYTE BackupPath[WINSINTF_MAX_NAME_SIZE + sizeof(WINS_BACKUP_DIR_ASCII)];
  415. CHAR *pLogFilePath;
  416. DWORD Error;
  417. BOOL fDirCr;
  418. LPTSTR pDllName;
  419. // static BOOL sLoaded = FALSE;
  420. try {
  421. // if (!sLoaded)
  422. {
  423. switch ( Version ) {
  424. case DbVersion351:
  425. pDllName = TEXT("jet.dll");
  426. RestoreProcName = (LPCSTR)0x9C;
  427. SetSystemParamProcName=(LPCSTR)165;
  428. break;
  429. case DbVersion4:
  430. pDllName = TEXT("jet500.dll");
  431. RestoreProcName = "JetRestore";
  432. SetSystemParamProcName="JetSetSystemParameter";
  433. break;
  434. case DbVersion5:
  435. pDllName = TEXT("esent.dll");
  436. RestoreProcName = "JetRestore";
  437. SetSystemParamProcName="JetSetSystemParameter";
  438. break;
  439. default:
  440. return WINSINTF_FAILURE;
  441. }
  442. // load the extension agent dll and resolve the entry points...
  443. if ((hExtension = GetModuleHandle(pDllName)) == NULL)
  444. {
  445. if ((hExtension = LoadLibrary(pDllName)) == NULL)
  446. {
  447. return(GetLastError());
  448. }
  449. else
  450. {
  451. if ((fRestoreFn = GetProcAddress(hExtension,RestoreProcName)) == (FARPROC)NULL)
  452. {
  453. RetStat = GetLastError();
  454. }
  455. if ((RetStat == ERROR_SUCCESS) && (Version != DbVersion351) )
  456. {
  457. if ((fSetSystemParamFn = GetProcAddress(hExtension,
  458. SetSystemParamProcName)) == (FARPROC)NULL)
  459. {
  460. RetStat = GetLastError();
  461. }
  462. }
  463. }
  464. }
  465. }
  466. // sLoaded = TRUE;
  467. //FUTURES("Change to lstrcpy and lstrcat when Jet starts supporting unicode")
  468. if (RetStat == WINSINTF_SUCCESS)
  469. {
  470. strcpy(BackupPath, pBackupPath);
  471. strcat(BackupPath, WINS_BACKUP_DIR_ASCII);
  472. fDirCr = CreateDirectoryA(BackupPath, NULL);
  473. if (!fDirCr && ((Error = GetLastError()) == ERROR_ALREADY_EXISTS))
  474. {
  475. if (Version != DbVersion351)
  476. {
  477. JET_INSTANCE JetInstance=0;
  478. #define BASENAME "j50"
  479. //
  480. // first set the system parameter for basename
  481. //
  482. //
  483. // Basename to use for jet*.log and jet.chk
  484. //
  485. // We should also specify the logfile path by checking WINS registry
  486. // but it is not essential.
  487. //
  488. // When WINS comes up, if it gets an error indicating that there
  489. // was a bad log signature or log version, it will delete all log
  490. // files and restart again.
  491. //
  492. do {
  493. JetRetStat = (JET_ERR)(*fSetSystemParamFn)(
  494. &JetInstance,
  495. (JET_SESID)0, //SesId - ignored
  496. JET_paramBaseName,
  497. 0,
  498. BASENAME
  499. );
  500. if (JetRetStat != JET_errSuccess) break;
  501. JetRetStat = (JET_ERR)(*fSetSystemParamFn)(
  502. &JetInstance,
  503. (JET_SESID)0, //SesId - ignored
  504. JET_paramLogFileSize,
  505. 1024,
  506. NULL
  507. );
  508. JetRetStat = WinsReadLogPath( &pLogFilePath );
  509. if (JetRetStat != JET_errSuccess) break;
  510. JetRetStat = (JET_ERR)(*fSetSystemParamFn)(
  511. &JetInstance,
  512. (JET_SESID)0, //SesId - ignored
  513. JET_paramLogFilePath,
  514. 0,
  515. pLogFilePath
  516. );
  517. } while (FALSE);
  518. if (JetRetStat == JET_errSuccess) {
  519. JetRetStat = (JET_ERR)(*fRestoreFn)((const char *)BackupPath, NULL);
  520. }
  521. }
  522. else
  523. {
  524. JetRetStat = (JET_ERR)(*fRestoreFn)((const char *)BackupPath, 0, NULL, (JET_PFNSTATUS)NULL);
  525. }
  526. if (JetRetStat != JET_errSuccess)
  527. {
  528. RetStat = WINSINTF_FAILURE;
  529. }
  530. }
  531. else
  532. {
  533. //
  534. // If CreateDirectoryA was successful, renove the directory
  535. //
  536. if (fDirCr)
  537. {
  538. RemoveDirectoryA(BackupPath);
  539. RetStat = WINSINTF_FAILURE;
  540. }
  541. else
  542. {
  543. RetStat = Error;
  544. }
  545. }
  546. }
  547. }
  548. except(EXCEPTION_EXECUTE_HANDLER) {
  549. RetStat = WINSINTF_FAILURE;
  550. }
  551. if (!FreeLibrary(hExtension))
  552. {
  553. RetStat = GetLastError();
  554. }
  555. return(RetStat);
  556. }
  557. DWORD
  558. WinsWorkerThdUpd(
  559. WINSIF2_HANDLE ServerHdl,
  560. DWORD NewNoOfNbtThds
  561. )
  562. {
  563. DWORD status;
  564. RpcTryExcept {
  565. status = R_WinsWorkerThdUpd(
  566. ServerHdl,
  567. NewNoOfNbtThds);
  568. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  569. status = RpcExceptionCode();
  570. } RpcEndExcept
  571. return status;
  572. }
  573. DWORD
  574. WinsSyncUp(
  575. WINSIF2_HANDLE ServerHdl,
  576. PWINSINTF_ADD_T pWinsAdd,
  577. PWINSINTF_ADD_T pOwnerAdd
  578. )
  579. {
  580. DWORD status;
  581. WINSINTF_VERS_NO_T MinVersNo, MaxVersNo;
  582. //
  583. // Set both version numbers to zero
  584. //
  585. MinVersNo.LowPart = 0;
  586. MinVersNo.HighPart = 0;
  587. MaxVersNo = MinVersNo;
  588. RpcTryExcept {
  589. status = R_WinsPullRange(
  590. ServerHdl,
  591. pWinsAdd, pOwnerAdd, MinVersNo, MaxVersNo);
  592. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  593. status = RpcExceptionCode();
  594. } RpcEndExcept
  595. return status;
  596. }
  597. DWORD
  598. WinsGetNameAndAdd(
  599. WINSIF2_HANDLE ServerHdl,
  600. PWINSINTF_ADD_T pWinsAdd,
  601. LPBYTE pUncName
  602. )
  603. {
  604. DWORD status;
  605. RpcTryExcept {
  606. status = R_WinsGetNameAndAdd(
  607. ServerHdl,
  608. pWinsAdd, pUncName);
  609. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  610. status = RpcExceptionCode();
  611. } RpcEndExcept
  612. return status;
  613. }
  614. DWORD
  615. WinsDeleteWins(
  616. WINSIF2_HANDLE ServerHdl,
  617. PWINSINTF_ADD_T pWinsAdd)
  618. {
  619. DWORD status;
  620. RpcTryExcept {
  621. status = R_WinsDeleteWins(
  622. ServerHdl,
  623. pWinsAdd);
  624. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  625. status = RpcExceptionCode();
  626. } RpcEndExcept
  627. return status;
  628. }
  629. DWORD
  630. WinsSetFlags(
  631. WINSIF2_HANDLE ServerHdl,
  632. DWORD fFlags)
  633. {
  634. DWORD status;
  635. RpcTryExcept {
  636. status = R_WinsSetFlags(
  637. ServerHdl,
  638. fFlags);
  639. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  640. status = RpcExceptionCode();
  641. } RpcEndExcept
  642. return status;
  643. }
  644. DWORD
  645. WinsGetDbRecsByName(
  646. WINSIF2_HANDLE ServerHdl,
  647. PWINSINTF_ADD_T pWinsAdd,
  648. DWORD Location,
  649. LPBYTE pName,
  650. DWORD NameLen,
  651. DWORD NoOfRecsDesired,
  652. DWORD fOnlyStatic,
  653. PWINSINTF_RECS_T pRecs
  654. )
  655. {
  656. DWORD status;
  657. RpcTryExcept {
  658. status = R_WinsGetDbRecsByName(
  659. ServerHdl,
  660. pWinsAdd,
  661. Location,
  662. pName,
  663. NameLen,
  664. NoOfRecsDesired,
  665. fOnlyStatic,
  666. pRecs);
  667. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  668. status = RpcExceptionCode();
  669. } RpcEndExcept
  670. return status;
  671. }
  672. DWORD
  673. WinsTombstoneDbRecs(
  674. WINSIF2_HANDLE ServerHdl,
  675. PWINSINTF_ADD_T pWinsAdd,
  676. WINSINTF_VERS_NO_T MinVersNo,
  677. WINSINTF_VERS_NO_T MaxVersNo
  678. )
  679. {
  680. DWORD status;
  681. RpcTryExcept {
  682. status = R_WinsTombstoneDbRecs(ServerHdl, pWinsAdd, MinVersNo, MaxVersNo);
  683. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  684. status = RpcExceptionCode();
  685. } RpcEndExcept
  686. return status;
  687. }
  688. DWORD
  689. WinsCheckAccess(
  690. WINSIF2_HANDLE ServerHdl,
  691. DWORD *Access
  692. )
  693. {
  694. DWORD status;
  695. RpcTryExcept {
  696. status = R_WinsCheckAccess(ServerHdl, Access);
  697. } RpcExcept( I_RpcExceptionFilter(RpcExceptionCode()) ) {
  698. status = RpcExceptionCode();
  699. } RpcEndExcept
  700. return status;
  701. }
  702.