Leaked source code of windows server 2003
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.

2142 lines
58 KiB

  1. /*++
  2. Copyright (c) 2001 Microsoft Corporation
  3. Module Name:
  4. wzclog.c
  5. Abstract:
  6. This module contains all of the code to service the
  7. API calls made to the SPD logging server.
  8. Author:
  9. abhisheV 18-October-2001
  10. Environment
  11. User Level: Win32
  12. Revision History:
  13. --*/
  14. #include "precomp.h"
  15. DWORD
  16. OpenWZCDbLogSession(
  17. LPWSTR pServerName,
  18. DWORD dwVersion,
  19. PHANDLE phSession
  20. )
  21. /*++
  22. Routine Description:
  23. This function opens a new session for a client.
  24. Arguments:
  25. pServerName - Pointer to the server name.
  26. phSession - Pointer to hold the handle for the opened session.
  27. Return Value:
  28. Windows Error.
  29. --*/
  30. {
  31. DWORD Error = 0;
  32. PSESSION_CONTAINER pSessionCont = NULL;
  33. Error = CreateSessionCont(
  34. &pSessionCont
  35. );
  36. BAIL_ON_WIN32_ERROR(Error);
  37. AcquireExclusiveLock(gpWZCDbSessionRWLock);
  38. if (gdwWZCDbSessionCount >= MAX_SESSION_NUM){
  39. Error = ERROR_REMOTE_SESSION_LIMIT_EXCEEDED;
  40. BAIL_ON_LOCK_ERROR(Error);
  41. }
  42. if (!gbDBOpened) {
  43. Error = WZCOpenAppendSession(gpAppendSessionCont);
  44. BAIL_ON_LOCK_ERROR(Error);
  45. gbDBOpened = TRUE;
  46. }
  47. Error = IniOpenWZCDbLogSession(pSessionCont);
  48. BAIL_ON_LOCK_ERROR(Error);
  49. pSessionCont->pNext = gpSessionCont;
  50. gpSessionCont = pSessionCont;
  51. *phSession = (HANDLE)pSessionCont;
  52. gdwWZCDbSessionCount ++;
  53. ReleaseExclusiveLock(gpWZCDbSessionRWLock);
  54. return (Error);
  55. lock:
  56. ReleaseExclusiveLock(gpWZCDbSessionRWLock);
  57. error:
  58. if (pSessionCont) {
  59. FreeSessionCont(pSessionCont);
  60. }
  61. *phSession = NULL;
  62. return (Error);
  63. }
  64. DWORD
  65. CreateSessionCont(
  66. PSESSION_CONTAINER * ppSessionCont
  67. )
  68. {
  69. DWORD dwError = 0;
  70. PSESSION_CONTAINER pSessionCont = NULL;
  71. pSessionCont = LocalAlloc(LMEM_ZEROINIT, sizeof(SESSION_CONTAINER));
  72. if (!pSessionCont) {
  73. dwError = ERROR_OUTOFMEMORY;
  74. BAIL_ON_WIN32_ERROR(dwError);
  75. }
  76. memset(pSessionCont, 0, sizeof(SESSION_CONTAINER));
  77. *ppSessionCont = pSessionCont;
  78. return (dwError);
  79. error:
  80. *ppSessionCont = NULL;
  81. return (dwError);
  82. }
  83. DWORD
  84. IniOpenWZCDbLogSession(
  85. PSESSION_CONTAINER pSessionCont
  86. )
  87. /*++
  88. Routine Description:
  89. This function opens a new session for a client.
  90. Arguments:
  91. pSessionCont - Pointer to hold the opened session data.
  92. Return Value:
  93. Windows Error.
  94. --*/
  95. {
  96. JET_ERR JetError = JET_errSuccess;
  97. DWORD Error = 0;
  98. char DBFilePath[MAX_PATH];
  99. char * pc = NULL;
  100. JET_SESID * pMyJetServerSession = NULL;
  101. JET_DBID * pMyJetDatabaseHandle = NULL;
  102. JET_TABLEID * pMyClientTableHandle = NULL;
  103. memset(DBFilePath, 0, sizeof(CHAR)*MAX_PATH);
  104. pMyJetServerSession = (JET_SESID *) &(pSessionCont->SessionID);
  105. pMyJetDatabaseHandle = (JET_DBID *) &(pSessionCont->DbID);
  106. pMyClientTableHandle = (JET_TABLEID *) &(pSessionCont->TableID);
  107. //
  108. // Create database file name.
  109. //
  110. pc = getenv(DBFILENAMEPREFIX);
  111. if (pc != NULL) {
  112. if (lstrlenA(pc) >
  113. MAX_PATH - lstrlenA(DBFILENAMESUFFIX) - lstrlenA(DBFILENAME) -1)
  114. {
  115. Error = ERROR_FILENAME_EXCED_RANGE;
  116. BAIL_ON_WIN32_ERROR(Error);
  117. }
  118. strcpy(DBFilePath, pc);
  119. strcat(DBFilePath, DBFILENAMESUFFIX);
  120. }
  121. else {
  122. if (0 > MAX_PATH - lstrlenA(DBFILENAMESUFFIX) - lstrlenA(DBFILENAME) -1)
  123. {
  124. Error = ERROR_FILENAME_EXCED_RANGE;
  125. BAIL_ON_WIN32_ERROR(Error);
  126. }
  127. strcpy(DBFilePath, DBFILENAMESUFFIX);
  128. }
  129. strcat(DBFilePath, DBFILENAME);
  130. //
  131. // Convert name to ANSI.
  132. //
  133. OemToCharBuffA(DBFilePath, DBFilePath, MAX_PATH);
  134. JetError = JetBeginSession(
  135. gJetInstance,
  136. pMyJetServerSession,
  137. "admin",
  138. ""
  139. );
  140. Error = WZCMapJetError(JetError, "JetBeginSession");
  141. BAIL_ON_WIN32_ERROR(Error);
  142. JetError = JetOpenDatabase(
  143. *pMyJetServerSession,
  144. DBFilePath,
  145. 0,
  146. pMyJetDatabaseHandle,
  147. 0
  148. );
  149. Error = WZCMapJetError(JetError, "JetOpenDatabase");
  150. BAIL_ON_WIN32_ERROR(Error);
  151. JetError = JetOpenTable(
  152. *pMyJetServerSession,
  153. *pMyJetDatabaseHandle,
  154. LOG_RECORD_TABLE,
  155. NULL,
  156. 0,
  157. 0,
  158. pMyClientTableHandle
  159. );
  160. Error = WZCMapJetError(JetError, "JetOpenTable");
  161. BAIL_ON_WIN32_ERROR(Error);
  162. return (Error);
  163. error:
  164. if (pMyJetServerSession && *pMyJetServerSession) {
  165. JetError = JetEndSession(*pMyJetServerSession, 0);
  166. WZCMapJetError(JetError, "JetEndSession");
  167. *pMyJetServerSession = 0;
  168. }
  169. return (Error);
  170. }
  171. VOID
  172. FreeSessionCont(
  173. PSESSION_CONTAINER pSessionCont
  174. )
  175. {
  176. if (pSessionCont) {
  177. LocalFree(pSessionCont);
  178. }
  179. return;
  180. }
  181. DWORD
  182. CloseWZCDbLogSession(
  183. HANDLE hSession
  184. )
  185. /*++
  186. Routine Description:
  187. This function ends a session for a client.
  188. Arguments:
  189. hSession - Handle for the session to end.
  190. Return Value:
  191. Windows Error.
  192. --*/
  193. {
  194. DWORD Error = 0;
  195. PSESSION_CONTAINER pSessionCont = NULL;
  196. AcquireExclusiveLock(gpWZCDbSessionRWLock);
  197. Error = GetSessionContainer(hSession, &pSessionCont);
  198. BAIL_ON_LOCK_ERROR(Error);
  199. Error = IniCloseWZCDbLogSession(pSessionCont);
  200. BAIL_ON_LOCK_ERROR(Error);
  201. RemoveSessionCont(
  202. pSessionCont
  203. );
  204. FreeSessionCont(pSessionCont);
  205. gdwWZCDbSessionCount --;
  206. if (!gbEnableDbLogging) {
  207. if (gdwWZCDbSessionCount == 0) {
  208. ASSERT(gbDBOpened == TRUE);
  209. (VOID) WZCCloseAppendSession(gpAppendSessionCont);
  210. gbDBOpened = FALSE;
  211. }
  212. }
  213. ReleaseExclusiveLock(gpWZCDbSessionRWLock);
  214. return (Error);
  215. lock:
  216. ReleaseExclusiveLock(gpWZCDbSessionRWLock);
  217. return (Error);
  218. }
  219. DWORD
  220. GetSessionContainer(
  221. HANDLE hSession,
  222. PSESSION_CONTAINER * ppSessionCont
  223. )
  224. {
  225. DWORD Error = ERROR_INVALID_HANDLE;
  226. PSESSION_CONTAINER * ppTemp = NULL;
  227. PSESSION_CONTAINER pSessionCont = (PSESSION_CONTAINER) hSession;
  228. *ppSessionCont = NULL;
  229. ppTemp = &gpSessionCont;
  230. while (*ppTemp) {
  231. if (*ppTemp == pSessionCont) {
  232. break;
  233. }
  234. ppTemp = &((*ppTemp)->pNext);
  235. }
  236. if (*ppTemp) {
  237. *ppSessionCont = *ppTemp;
  238. Error = ERROR_SUCCESS;
  239. }
  240. return (Error);
  241. }
  242. DWORD
  243. IniCloseWZCDbLogSession(
  244. PSESSION_CONTAINER pSessionCont
  245. )
  246. /*++
  247. Routine Description:
  248. This function ends a session for a client.
  249. Arguments:
  250. pSessionCont - Pointer to the session data for the session to end.
  251. Return Value:
  252. Windows Error.
  253. --*/
  254. {
  255. JET_ERR JetError = JET_errSuccess;
  256. DWORD Error = 0;
  257. JET_SESID * pMyJetServerSession = NULL;
  258. pMyJetServerSession = (JET_SESID *) &(pSessionCont->SessionID);
  259. if (*pMyJetServerSession) {
  260. JetError = JetEndSession(*pMyJetServerSession, 0);
  261. Error = WZCMapJetError(JetError, "JetEndSession");
  262. BAIL_ON_WIN32_ERROR(Error);
  263. *pMyJetServerSession = 0;
  264. }
  265. error:
  266. return (Error);
  267. }
  268. VOID
  269. RemoveSessionCont(
  270. PSESSION_CONTAINER pSessionCont
  271. )
  272. {
  273. PSESSION_CONTAINER * ppTemp = NULL;
  274. ppTemp = &gpSessionCont;
  275. while (*ppTemp) {
  276. if (*ppTemp == pSessionCont) {
  277. break;
  278. }
  279. ppTemp = &((*ppTemp)->pNext);
  280. }
  281. if (*ppTemp) {
  282. *ppTemp = pSessionCont->pNext;
  283. }
  284. return;
  285. }
  286. VOID
  287. DestroySessionContList(
  288. PSESSION_CONTAINER pSessionContList
  289. )
  290. {
  291. PSESSION_CONTAINER pSessionCont = NULL;
  292. PSESSION_CONTAINER pTemp = NULL;
  293. pSessionCont = pSessionContList;
  294. while (pSessionCont) {
  295. pTemp = pSessionCont;
  296. pSessionCont = pSessionCont->pNext;
  297. (VOID) IniCloseWZCDbLogSession(pTemp);
  298. FreeSessionCont(pTemp);
  299. }
  300. }
  301. DWORD
  302. WZCOpenAppendSession(
  303. PSESSION_CONTAINER pSessionCont
  304. )
  305. /*++
  306. Routine Description:
  307. This function tries to open a database in DBFILENAME and its table.
  308. If the database does not exist, it creates the database and creates
  309. the table as well.
  310. If just the table does not exist, it creates the table and opens it.
  311. Arguments:
  312. pSessionCont - Pointer to the session container.
  313. Return Value:
  314. Windows Error.
  315. --*/
  316. {
  317. DWORD dwError = 0;
  318. DWORD dwTempIdx = 0;
  319. DWORD dwReqSize = 0;
  320. BOOL bInitializedDb = FALSE;
  321. JET_SESID * pMyJetServerSession = NULL;
  322. JET_DBID * pMyJetDatabaseHandle = NULL;
  323. JET_TABLEID * pMyClientTableHandle = NULL;
  324. JET_ERR JetError = JET_errSuccess;
  325. pMyJetServerSession = (JET_SESID *) &(pSessionCont->SessionID);
  326. pMyJetDatabaseHandle = (JET_DBID *) &(pSessionCont->DbID);
  327. pMyClientTableHandle = (JET_TABLEID *) &(pSessionCont->TableID);
  328. gdwCurrentHeader = 1;
  329. gdwCurrentTableSize = 0;
  330. gdwCurrentMaxRecordID = 0;
  331. dwError = WZCInitializeDatabase(
  332. pMyJetServerSession
  333. );
  334. BAIL_ON_WIN32_ERROR(dwError);
  335. bInitializedDb = TRUE;
  336. dwError = WZCCreateDatabase(
  337. *pMyJetServerSession,
  338. 0,
  339. pMyJetDatabaseHandle,
  340. 0
  341. );
  342. if (!dwError) {
  343. dwError = WZCGetTableDataHandle(
  344. pMyJetServerSession,
  345. pMyJetDatabaseHandle,
  346. pMyClientTableHandle
  347. );
  348. BAIL_ON_WIN32_ERROR(dwError);
  349. return (ERROR_SUCCESS);
  350. }
  351. //
  352. // Database already exists.
  353. //
  354. dwError = WZCOpenDatabase(
  355. *pMyJetServerSession,
  356. 0,
  357. pMyJetDatabaseHandle,
  358. 0
  359. );
  360. BAIL_ON_WIN32_ERROR(dwError);
  361. dwError = WZCGetTableDataHandle(
  362. pMyJetServerSession,
  363. pMyJetDatabaseHandle,
  364. pMyClientTableHandle
  365. );
  366. //
  367. // If the table does not have correct columns, delete it and create a
  368. // new table.
  369. //
  370. if (dwError != JET_errColumnNotFound) {
  371. BAIL_ON_WIN32_ERROR(dwError);
  372. }
  373. else {
  374. JetError = JetCloseTable(
  375. *pMyJetServerSession,
  376. *pMyClientTableHandle
  377. );
  378. dwError = WZCMapJetError(JetError, "JetCloseTable");
  379. BAIL_ON_WIN32_ERROR(dwError);
  380. *pMyClientTableHandle = 0;
  381. JetError = JetDeleteTable(
  382. *pMyJetServerSession,
  383. *pMyJetDatabaseHandle,
  384. LOG_RECORD_TABLE
  385. );
  386. dwError = WZCMapJetError(JetError, "JetDeleteTable");
  387. BAIL_ON_WIN32_ERROR(dwError);
  388. dwError = WZCGetTableDataHandle(
  389. pMyJetServerSession,
  390. pMyJetDatabaseHandle,
  391. pMyClientTableHandle
  392. );
  393. BAIL_ON_WIN32_ERROR(dwError);
  394. }
  395. //
  396. // Initialize current table size and current header.
  397. // Find out total number of records in table.
  398. //
  399. JetError = JetSetCurrentIndex(
  400. *pMyJetServerSession,
  401. *pMyClientTableHandle,
  402. gLogRecordTable[RECORD_IDX_IDX].ColName
  403. );
  404. dwError = WZCMapJetError(JetError, "JetSetCurrentIndex");
  405. BAIL_ON_WIN32_ERROR(dwError);
  406. //
  407. // Jump to the last record.
  408. //
  409. JetError = JetMove(
  410. *pMyJetServerSession,
  411. *pMyClientTableHandle,
  412. JET_MoveLast,
  413. 0
  414. );
  415. dwError = WZCMapJetError(JetError, "JetMove");
  416. if (dwError != ERROR_SUCCESS) {
  417. dwError = ERROR_SUCCESS;
  418. return (dwError);
  419. }
  420. //
  421. // Check if the logical end of table has been hit.
  422. //
  423. dwError = WZCJetGetValue(
  424. *pMyJetServerSession,
  425. *pMyClientTableHandle,
  426. gLogRecordTable[RECORD_IDX_IDX].ColHandle,
  427. &dwTempIdx,
  428. sizeof(dwTempIdx),
  429. &dwReqSize
  430. );
  431. BAIL_ON_WIN32_ERROR(dwError);
  432. gdwCurrentTableSize = dwTempIdx;
  433. //
  434. // Find out the current header.
  435. //
  436. JetError = JetSetCurrentIndex(
  437. *pMyJetServerSession,
  438. *pMyClientTableHandle,
  439. gLogRecordTable[TIMESTAMP_IDX].ColName
  440. );
  441. dwError = WZCMapJetError(JetError, "JetSetCurrentIndex");
  442. BAIL_ON_WIN32_ERROR(dwError);
  443. JetError = JetMove(
  444. *pMyJetServerSession,
  445. *pMyClientTableHandle,
  446. JET_MoveFirst,
  447. 0
  448. );
  449. dwError = WZCMapJetError(JetError, "JetMove");
  450. BAIL_ON_WIN32_ERROR(dwError);
  451. dwError = WZCJetGetValue(
  452. *pMyJetServerSession,
  453. *pMyClientTableHandle,
  454. gLogRecordTable[RECORD_IDX_IDX].ColHandle,
  455. &dwTempIdx,
  456. sizeof(dwTempIdx),
  457. &dwReqSize
  458. );
  459. BAIL_ON_WIN32_ERROR(dwError);
  460. gdwCurrentHeader = dwTempIdx;
  461. return (dwError);
  462. error:
  463. if (bInitializedDb) {
  464. WZCCloseAppendSession(pSessionCont);
  465. }
  466. return (dwError);
  467. }
  468. DWORD
  469. WZCCloseAppendSession(
  470. PSESSION_CONTAINER pSessionCont
  471. )
  472. /*++
  473. Routine Description:
  474. This function tries to close the database and the append session.
  475. Arguments:
  476. pSessionCont - Pointer to the session container.
  477. Return Value:
  478. Windows Error.
  479. --*/
  480. {
  481. DWORD dwError = 0;
  482. JET_ERR JetError = JET_errSuccess;
  483. JET_SESID * pMyJetServerSession = NULL;
  484. pMyJetServerSession = (JET_SESID *) &(pSessionCont->SessionID);
  485. if (*pMyJetServerSession != 0) {
  486. JetError = JetEndSession(*pMyJetServerSession, 0);
  487. dwError = WZCMapJetError(JetError, "JetEndSession");
  488. *pMyJetServerSession = 0;
  489. }
  490. JetError = JetTerm2(gJetInstance, JET_bitTermComplete);
  491. gJetInstance = 0;
  492. dwError = WZCMapJetError(JetError, "JetTerm/JetTerm2");
  493. return (dwError);
  494. }
  495. DWORD
  496. AddWZCDbLogRecord(
  497. LPWSTR pServerName,
  498. DWORD dwVersion,
  499. PWZC_DB_RECORD pWZCRecord,
  500. LPVOID pvReserved
  501. )
  502. /*++
  503. Routine Description:
  504. This function appends a new record into the table.
  505. Arguments:
  506. pServerName - Pointer to the server name.
  507. pWZCRecord - Pointer to the record to be appended.
  508. Return Value:
  509. Windows Error.
  510. --*/
  511. {
  512. DWORD Error = 0;
  513. BOOL bStartedTransaction = FALSE;
  514. JET_ERR JetError = JET_errSuccess;
  515. SYSTEMTIME stLocalTime;
  516. BOOL bNewRecord = TRUE;
  517. DWORD dwTempKey = 0;
  518. JET_SESID * pMyJetServerSession = NULL;
  519. JET_DBID * pMyJetDatabaseHandle = NULL;
  520. JET_TABLEID * pMyClientTableHandle = NULL;
  521. DWORD LocalError = 0;
  522. //
  523. // Get current time as time stamp for the record.
  524. //
  525. GetLocalTime(&stLocalTime);
  526. SystemTimeToFileTime(&stLocalTime, &(pWZCRecord->timestamp));
  527. AcquireExclusiveLock(gpWZCDbSessionRWLock);
  528. if (!gbDBOpened) {
  529. Error = ERROR_INVALID_STATE;
  530. BAIL_ON_LOCK_ERROR(Error);
  531. }
  532. if (!gbEnableDbLogging) {
  533. Error = ERROR_INVALID_STATE;
  534. BAIL_ON_LOCK_ERROR(Error);
  535. }
  536. pMyJetServerSession = (JET_SESID *) &(gpAppendSessionCont->SessionID);
  537. pMyJetDatabaseHandle = (JET_DBID *) &(gpAppendSessionCont->DbID);
  538. pMyClientTableHandle = (JET_TABLEID *) &(gpAppendSessionCont->TableID);
  539. if (!(*pMyClientTableHandle)) {
  540. Error = WZCGetTableDataHandle(
  541. pMyJetServerSession,
  542. pMyJetDatabaseHandle,
  543. pMyClientTableHandle
  544. );
  545. BAIL_ON_LOCK_ERROR(Error);
  546. }
  547. //
  548. // Insert a new record or replace a old one.
  549. //
  550. if (gdwCurrentTableSize < MAX_RECORD_NUM) {
  551. bNewRecord = TRUE;
  552. }
  553. else {
  554. bNewRecord = FALSE;
  555. dwTempKey = gdwCurrentHeader;
  556. }
  557. Error = WZCJetBeginTransaction(*pMyJetServerSession);
  558. BAIL_ON_LOCK_ERROR(Error);
  559. bStartedTransaction = TRUE;
  560. //
  561. // Prepare for insertion/replacement.
  562. //
  563. Error = WZCJetPrepareUpdate(
  564. *pMyJetServerSession,
  565. *pMyClientTableHandle,
  566. gLogRecordTable[RECORD_IDX_IDX].ColName,
  567. &dwTempKey,
  568. sizeof(dwTempKey),
  569. bNewRecord
  570. );
  571. BAIL_ON_LOCK_ERROR(Error);
  572. Error = WZCJetSetValue(
  573. *pMyJetServerSession,
  574. *pMyClientTableHandle,
  575. gLogRecordTable[RECORD_ID_IDX].ColHandle,
  576. &(gdwCurrentMaxRecordID),
  577. sizeof(gdwCurrentMaxRecordID)
  578. );
  579. BAIL_ON_LOCK_ERROR(Error);
  580. Error = WZCJetSetValue(
  581. *pMyJetServerSession,
  582. *pMyClientTableHandle,
  583. gLogRecordTable[COMPONENT_ID_IDX].ColHandle,
  584. &(pWZCRecord->componentid),
  585. sizeof(pWZCRecord->componentid)
  586. );
  587. BAIL_ON_LOCK_ERROR(Error);
  588. Error = WZCJetSetValue(
  589. *pMyJetServerSession,
  590. *pMyClientTableHandle,
  591. gLogRecordTable[CATEGORY_IDX].ColHandle,
  592. &(pWZCRecord->category),
  593. sizeof(pWZCRecord->category)
  594. );
  595. BAIL_ON_LOCK_ERROR(Error);
  596. Error = WZCJetSetValue(
  597. *pMyJetServerSession,
  598. *pMyClientTableHandle,
  599. gLogRecordTable[TIMESTAMP_IDX].ColHandle,
  600. &(pWZCRecord->timestamp),
  601. sizeof(pWZCRecord->timestamp)
  602. );
  603. BAIL_ON_LOCK_ERROR(Error);
  604. Error = WZCJetSetValue(
  605. *pMyJetServerSession,
  606. *pMyClientTableHandle,
  607. gLogRecordTable[MESSAGE_IDX].ColHandle,
  608. (pWZCRecord->message).pData,
  609. (pWZCRecord->message).dwDataLen
  610. );
  611. BAIL_ON_LOCK_ERROR(Error);
  612. Error = WZCJetSetValue(
  613. *pMyJetServerSession,
  614. *pMyClientTableHandle,
  615. gLogRecordTable[INTERFACE_MAC_IDX].ColHandle,
  616. (pWZCRecord->localmac).pData,
  617. (pWZCRecord->localmac).dwDataLen
  618. );
  619. BAIL_ON_LOCK_ERROR(Error);
  620. Error = WZCJetSetValue(
  621. *pMyJetServerSession,
  622. *pMyClientTableHandle,
  623. gLogRecordTable[DEST_MAC_IDX].ColHandle,
  624. (pWZCRecord->remotemac).pData,
  625. (pWZCRecord->remotemac).dwDataLen
  626. );
  627. BAIL_ON_LOCK_ERROR(Error);
  628. Error = WZCJetSetValue(
  629. *pMyJetServerSession,
  630. *pMyClientTableHandle,
  631. gLogRecordTable[SSID_IDX].ColHandle,
  632. (pWZCRecord->ssid).pData,
  633. (pWZCRecord->ssid).dwDataLen
  634. );
  635. BAIL_ON_LOCK_ERROR(Error);
  636. Error = WZCJetSetValue(
  637. *pMyJetServerSession,
  638. *pMyClientTableHandle,
  639. gLogRecordTable[CONTEXT_IDX].ColHandle,
  640. (pWZCRecord->context).pData,
  641. (pWZCRecord->context).dwDataLen
  642. );
  643. BAIL_ON_LOCK_ERROR(Error);
  644. JetError = JetUpdate(
  645. *pMyJetServerSession,
  646. *pMyClientTableHandle,
  647. NULL,
  648. 0,
  649. NULL
  650. );
  651. Error = WZCMapJetError(JetError, "AddWZCDbLogRecord: JetUpdate");
  652. BAIL_ON_LOCK_ERROR(Error);
  653. //
  654. // Commit changes.
  655. //
  656. Error = WZCJetCommitTransaction(
  657. *pMyJetServerSession,
  658. *pMyClientTableHandle
  659. );
  660. BAIL_ON_LOCK_ERROR(Error);
  661. if (gdwCurrentTableSize < MAX_RECORD_NUM) {
  662. gdwCurrentTableSize++;
  663. }
  664. else {
  665. gdwCurrentHeader = (gdwCurrentHeader + 1) > MAX_RECORD_NUM ?
  666. 1 : (gdwCurrentHeader + 1);
  667. }
  668. ReleaseExclusiveLock(gpWZCDbSessionRWLock);
  669. return (Error);
  670. lock:
  671. //
  672. // If the transaction has been started, then roll back to the
  673. // start point, so that the database does not become inconsistent.
  674. //
  675. if (bStartedTransaction == TRUE) {
  676. LocalError = WZCJetRollBack(*pMyJetServerSession);
  677. }
  678. ReleaseExclusiveLock(gpWZCDbSessionRWLock);
  679. return (Error);
  680. }
  681. DWORD
  682. EnumWZCDbLogRecords(
  683. HANDLE hSession,
  684. PWZC_DB_RECORD pTemplateRecord,
  685. PBOOL pbEnumFromStart,
  686. DWORD dwPreferredNumEntries,
  687. PWZC_DB_RECORD * ppWZCRecords,
  688. LPDWORD pdwNumRecords,
  689. LPVOID pvReserved
  690. )
  691. {
  692. DWORD Error = 0;
  693. PSESSION_CONTAINER pSessionCont = NULL;
  694. AcquireSharedLock(gpWZCDbSessionRWLock);
  695. Error = GetSessionContainer(hSession, &pSessionCont);
  696. BAIL_ON_LOCK_ERROR(Error);
  697. if (pTemplateRecord) {
  698. Error = ERROR_NOT_SUPPORTED;
  699. }
  700. else {
  701. Error = IniEnumWZCDbLogRecords(
  702. pSessionCont,
  703. pbEnumFromStart,
  704. dwPreferredNumEntries,
  705. ppWZCRecords,
  706. pdwNumRecords
  707. );
  708. }
  709. BAIL_ON_LOCK_ERROR(Error);
  710. ReleaseSharedLock(gpWZCDbSessionRWLock);
  711. return (Error);
  712. lock:
  713. ReleaseSharedLock(gpWZCDbSessionRWLock);
  714. return (Error);
  715. }
  716. DWORD
  717. IniEnumWZCDbLogRecords(
  718. PSESSION_CONTAINER pSessionCont,
  719. PBOOL pbEnumFromStart,
  720. DWORD dwPreferredNumEntries,
  721. PWZC_DB_RECORD * ppWZCRecords,
  722. LPDWORD pdwNumRecords
  723. )
  724. {
  725. DWORD dwError = 0;
  726. DWORD dwNumToEnum = 0;
  727. PWZC_DB_RECORD pWZCRecords = NULL;
  728. JET_SESID * pMyJetServerSession = NULL;
  729. JET_DBID * pMyJetDatabaseHandle = NULL;
  730. JET_TABLEID * pMyClientTableHandle = NULL;
  731. DWORD i = 0;
  732. PWZC_DB_RECORD pCurWZCRecord = NULL;
  733. JET_ERR JetError = JET_errSuccess;
  734. DWORD dwReqSize = 0;
  735. char cTempBuf[MAX_RAW_DATA_SIZE];
  736. DWORD dwCurIndex = 0;
  737. BOOL bEnumFromStart = FALSE;
  738. if (!dwPreferredNumEntries ||
  739. (dwPreferredNumEntries > MAX_RECORD_ENUM_COUNT)) {
  740. dwNumToEnum = MAX_RECORD_ENUM_COUNT;
  741. }
  742. else {
  743. dwNumToEnum = dwPreferredNumEntries;
  744. }
  745. pWZCRecords = RpcCAlloc(sizeof(WZC_DB_RECORD)*dwNumToEnum);
  746. if (!pWZCRecords) {
  747. dwError = ERROR_OUTOFMEMORY;
  748. BAIL_ON_WIN32_ERROR(dwError);
  749. }
  750. memset(pWZCRecords, 0, sizeof(WZC_DB_RECORD)*dwNumToEnum);
  751. pMyJetServerSession = (JET_SESID *) &(pSessionCont->SessionID);
  752. pMyJetDatabaseHandle = (JET_DBID *) &(pSessionCont->DbID);
  753. pMyClientTableHandle = (JET_TABLEID *) &(pSessionCont->TableID);
  754. if (!(*pMyClientTableHandle)) {
  755. JetError = JetOpenTable(
  756. *pMyJetServerSession,
  757. *pMyJetDatabaseHandle,
  758. LOG_RECORD_TABLE,
  759. NULL,
  760. 0,
  761. 0,
  762. pMyClientTableHandle
  763. );
  764. dwError = WZCMapJetError(JetError, "JetOpenTable");
  765. BAIL_ON_WIN32_ERROR(dwError);
  766. }
  767. bEnumFromStart = *pbEnumFromStart;
  768. if (bEnumFromStart) {
  769. dwError = WZCJetPrepareSearch(
  770. *pMyJetServerSession,
  771. *pMyClientTableHandle,
  772. gLogRecordTable[TIMESTAMP_IDX].ColName,
  773. bEnumFromStart,
  774. NULL,
  775. 0
  776. );
  777. BAIL_ON_WIN32_ERROR(dwError);
  778. bEnumFromStart = FALSE;
  779. }
  780. for (i = 0; i < dwNumToEnum; i++) {
  781. pCurWZCRecord = (pWZCRecords + i);
  782. dwError = WZCJetGetValue(
  783. *pMyJetServerSession,
  784. *pMyClientTableHandle,
  785. gLogRecordTable[RECORD_ID_IDX].ColHandle,
  786. &(pCurWZCRecord->recordid),
  787. sizeof(pCurWZCRecord->recordid),
  788. &dwReqSize
  789. );
  790. BAIL_ON_WIN32_ERROR(dwError);
  791. dwError = WZCJetGetValue(
  792. *pMyJetServerSession,
  793. *pMyClientTableHandle,
  794. gLogRecordTable[COMPONENT_ID_IDX].ColHandle,
  795. &(pCurWZCRecord->componentid),
  796. sizeof(pCurWZCRecord->componentid),
  797. &dwReqSize
  798. );
  799. BAIL_ON_WIN32_ERROR(dwError);
  800. dwError = WZCJetGetValue(
  801. *pMyJetServerSession,
  802. *pMyClientTableHandle,
  803. gLogRecordTable[CATEGORY_IDX].ColHandle,
  804. &(pCurWZCRecord->category),
  805. sizeof(pCurWZCRecord->category),
  806. &dwReqSize
  807. );
  808. BAIL_ON_WIN32_ERROR(dwError);
  809. dwError = WZCJetGetValue(
  810. *pMyJetServerSession,
  811. *pMyClientTableHandle,
  812. gLogRecordTable[TIMESTAMP_IDX].ColHandle,
  813. &(pCurWZCRecord->timestamp),
  814. sizeof(pCurWZCRecord->timestamp),
  815. &dwReqSize
  816. );
  817. BAIL_ON_WIN32_ERROR(dwError);
  818. dwReqSize = 0;
  819. dwError = WZCJetGetValue(
  820. *pMyJetServerSession,
  821. *pMyClientTableHandle,
  822. gLogRecordTable[MESSAGE_IDX].ColHandle,
  823. cTempBuf,
  824. MAX_RAW_DATA_SIZE,
  825. &dwReqSize
  826. );
  827. BAIL_ON_WIN32_ERROR(dwError);
  828. if (dwReqSize > 0) {
  829. (pCurWZCRecord->message).pData = RpcCAlloc(dwReqSize);
  830. if (!((pCurWZCRecord->message).pData)) {
  831. dwError = ERROR_OUTOFMEMORY;
  832. BAIL_ON_WIN32_ERROR(dwError);
  833. }
  834. memcpy((pCurWZCRecord->message).pData, cTempBuf, dwReqSize);
  835. (pCurWZCRecord->message).dwDataLen = dwReqSize;
  836. }
  837. dwReqSize = 0;
  838. dwError = WZCJetGetValue(
  839. *pMyJetServerSession,
  840. *pMyClientTableHandle,
  841. gLogRecordTable[INTERFACE_MAC_IDX].ColHandle,
  842. cTempBuf,
  843. MAX_RAW_DATA_SIZE,
  844. &dwReqSize
  845. );
  846. BAIL_ON_WIN32_ERROR(dwError);
  847. if (dwReqSize > 0) {
  848. (pCurWZCRecord->localmac).pData = RpcCAlloc(dwReqSize);
  849. if (!((pCurWZCRecord->localmac).pData)) {
  850. dwError = ERROR_OUTOFMEMORY;
  851. BAIL_ON_WIN32_ERROR(dwError);
  852. }
  853. memcpy((pCurWZCRecord->localmac).pData, cTempBuf, dwReqSize);
  854. (pCurWZCRecord->localmac).dwDataLen = dwReqSize;
  855. }
  856. dwReqSize = 0;
  857. dwError = WZCJetGetValue(
  858. *pMyJetServerSession,
  859. *pMyClientTableHandle,
  860. gLogRecordTable[DEST_MAC_IDX].ColHandle,
  861. cTempBuf,
  862. MAX_RAW_DATA_SIZE,
  863. &dwReqSize
  864. );
  865. BAIL_ON_WIN32_ERROR(dwError);
  866. if (dwReqSize > 0) {
  867. (pCurWZCRecord->remotemac).pData = RpcCAlloc(dwReqSize);
  868. if (!((pCurWZCRecord->remotemac).pData)) {
  869. dwError = ERROR_OUTOFMEMORY;
  870. BAIL_ON_WIN32_ERROR(dwError);
  871. }
  872. memcpy((pCurWZCRecord->remotemac).pData, cTempBuf, dwReqSize);
  873. (pCurWZCRecord->remotemac).dwDataLen = dwReqSize;
  874. }
  875. dwReqSize = 0;
  876. dwError = WZCJetGetValue(
  877. *pMyJetServerSession,
  878. *pMyClientTableHandle,
  879. gLogRecordTable[SSID_IDX].ColHandle,
  880. cTempBuf,
  881. MAX_RAW_DATA_SIZE,
  882. &dwReqSize
  883. );
  884. BAIL_ON_WIN32_ERROR(dwError);
  885. if (dwReqSize > 0) {
  886. (pCurWZCRecord->ssid).pData = RpcCAlloc(dwReqSize);
  887. if (!((pCurWZCRecord->ssid).pData)) {
  888. dwError = ERROR_OUTOFMEMORY;
  889. BAIL_ON_WIN32_ERROR(dwError);
  890. }
  891. memcpy((pCurWZCRecord->ssid).pData, cTempBuf, dwReqSize);
  892. (pCurWZCRecord->ssid).dwDataLen = dwReqSize;
  893. }
  894. dwReqSize = 0;
  895. dwError = WZCJetGetValue(
  896. *pMyJetServerSession,
  897. *pMyClientTableHandle,
  898. gLogRecordTable[CONTEXT_IDX].ColHandle,
  899. cTempBuf,
  900. MAX_RAW_DATA_SIZE,
  901. &dwReqSize
  902. );
  903. BAIL_ON_WIN32_ERROR(dwError);
  904. if (dwReqSize > 0) {
  905. (pCurWZCRecord->context).pData = RpcCAlloc(dwReqSize);
  906. if (!((pCurWZCRecord->context).pData)) {
  907. dwError = ERROR_OUTOFMEMORY;
  908. BAIL_ON_WIN32_ERROR(dwError);
  909. }
  910. memcpy((pCurWZCRecord->context).pData, cTempBuf, dwReqSize);
  911. (pCurWZCRecord->context).dwDataLen = dwReqSize;
  912. }
  913. JetError = JetMove(
  914. *pMyJetServerSession,
  915. *pMyClientTableHandle,
  916. JET_MoveNext,
  917. 0
  918. );
  919. //
  920. // Don't bail from here as the end of the table (logical or physical)
  921. // is caught in the next call.
  922. //
  923. dwError = WZCJetGetValue(
  924. *pMyJetServerSession,
  925. *pMyClientTableHandle,
  926. gLogRecordTable[RECORD_IDX_IDX].ColHandle,
  927. &dwCurIndex,
  928. sizeof(dwCurIndex),
  929. &dwReqSize
  930. );
  931. if (dwCurIndex == gdwCurrentHeader || dwError != ERROR_SUCCESS) {
  932. dwError = ERROR_NO_MORE_ITEMS;
  933. i++;
  934. break;
  935. }
  936. }
  937. *pbEnumFromStart = bEnumFromStart;
  938. *ppWZCRecords = pWZCRecords;
  939. *pdwNumRecords = i;
  940. return (dwError);
  941. error:
  942. if (pWZCRecords) {
  943. FreeWZCRecords(pWZCRecords, dwNumToEnum);
  944. }
  945. *ppWZCRecords = NULL;
  946. *pdwNumRecords = 0;
  947. return (dwError);
  948. }
  949. VOID
  950. FreeWZCRecords(
  951. PWZC_DB_RECORD pWZCRecords,
  952. DWORD dwNumRecords
  953. )
  954. {
  955. DWORD i = 0;
  956. if (pWZCRecords) {
  957. for (i = 0; i < dwNumRecords; i++) {
  958. if (pWZCRecords[i].message.pData) {
  959. RpcFree(pWZCRecords[i].message.pData);
  960. }
  961. if (pWZCRecords[i].localmac.pData) {
  962. RpcFree(pWZCRecords[i].localmac.pData);
  963. }
  964. if (pWZCRecords[i].remotemac.pData) {
  965. RpcFree(pWZCRecords[i].remotemac.pData);
  966. }
  967. if (pWZCRecords[i].ssid.pData) {
  968. RpcFree(pWZCRecords[i].ssid.pData);
  969. }
  970. if (pWZCRecords[i].context.pData) {
  971. RpcFree(pWZCRecords[i].context.pData);
  972. }
  973. }
  974. RpcFree(pWZCRecords);
  975. }
  976. return;
  977. }
  978. DWORD
  979. FlushWZCDbLog(
  980. HANDLE hSession
  981. )
  982. {
  983. DWORD Error = 0;
  984. PSESSION_CONTAINER pSessionCont = NULL;
  985. AcquireExclusiveLock(gpWZCDbSessionRWLock);
  986. Error = GetSessionContainer(hSession, &pSessionCont);
  987. BAIL_ON_LOCK_ERROR(Error);
  988. Error = IniFlushWZCDbLog();
  989. BAIL_ON_LOCK_ERROR(Error);
  990. ReleaseExclusiveLock(gpWZCDbSessionRWLock);
  991. return (Error);
  992. lock:
  993. ReleaseExclusiveLock(gpWZCDbSessionRWLock);
  994. return (Error);
  995. }
  996. DWORD
  997. IniFlushWZCDbLog(
  998. )
  999. {
  1000. DWORD dwError = ERROR_SUCCESS;
  1001. DWORD JetError = JET_errSuccess;
  1002. JET_SESID * pMyJetServerSession = NULL;
  1003. JET_DBID * pMyJetDatabaseHandle = NULL;
  1004. JET_TABLEID * pMyClientTableHandle = NULL;
  1005. pMyJetServerSession = (JET_SESID *) &(gpAppendSessionCont->SessionID);
  1006. pMyJetDatabaseHandle = (JET_DBID *) &(gpAppendSessionCont->DbID);
  1007. pMyClientTableHandle = (JET_TABLEID *) &(gpAppendSessionCont->TableID);
  1008. dwError = CloseAllTableSessions(gpSessionCont);
  1009. BAIL_ON_WIN32_ERROR(dwError);
  1010. JetError = JetCloseTable(
  1011. *pMyJetServerSession,
  1012. *pMyClientTableHandle
  1013. );
  1014. dwError = WZCMapJetError(JetError, "JetCloseTable");
  1015. BAIL_ON_WIN32_ERROR(dwError);
  1016. *pMyClientTableHandle = 0;
  1017. JetError = JetDeleteTable(
  1018. *pMyJetServerSession,
  1019. *pMyJetDatabaseHandle,
  1020. LOG_RECORD_TABLE
  1021. );
  1022. dwError = WZCMapJetError(JetError, "JetDeleteTable");
  1023. BAIL_ON_WIN32_ERROR(dwError);
  1024. gdwCurrentHeader = 1;
  1025. gdwCurrentTableSize = 0;
  1026. gdwCurrentMaxRecordID = 0;
  1027. dwError = WZCGetTableDataHandle(
  1028. pMyJetServerSession,
  1029. pMyJetDatabaseHandle,
  1030. pMyClientTableHandle
  1031. );
  1032. BAIL_ON_WIN32_ERROR(dwError);
  1033. dwError = OpenAllTableSessions(gpSessionCont);
  1034. BAIL_ON_WIN32_ERROR(dwError);
  1035. return (dwError);
  1036. error:
  1037. return (dwError);
  1038. }
  1039. DWORD
  1040. CloseAllTableSessions(
  1041. PSESSION_CONTAINER pSessionContList
  1042. )
  1043. {
  1044. DWORD dwError = ERROR_SUCCESS;
  1045. DWORD JetError = JET_errSuccess;
  1046. PSESSION_CONTAINER pSessionCont = NULL;
  1047. pSessionCont = pSessionContList;
  1048. while (pSessionCont) {
  1049. JetError = JetCloseTable(
  1050. pSessionCont->SessionID,
  1051. pSessionCont->TableID
  1052. );
  1053. dwError = WZCMapJetError(JetError, "JetCloseTable");
  1054. BAIL_ON_WIN32_ERROR(dwError);
  1055. pSessionCont->TableID = 0;
  1056. pSessionCont = pSessionCont->pNext;
  1057. }
  1058. error:
  1059. return (dwError);
  1060. }
  1061. DWORD
  1062. OpenAllTableSessions(
  1063. PSESSION_CONTAINER pSessionContList
  1064. )
  1065. {
  1066. DWORD dwError = ERROR_SUCCESS;
  1067. DWORD JetError = JET_errSuccess;
  1068. PSESSION_CONTAINER pSessionCont = NULL;
  1069. pSessionCont = pSessionContList;
  1070. while (pSessionCont) {
  1071. if (pSessionCont->TableID == 0) {
  1072. JetError = JetOpenTable(
  1073. pSessionCont->SessionID,
  1074. (JET_DBID)(pSessionCont->DbID),
  1075. LOG_RECORD_TABLE,
  1076. NULL,
  1077. 0,
  1078. 0,
  1079. &pSessionCont->TableID
  1080. );
  1081. dwError = WZCMapJetError(JetError, "JetOpenTable");
  1082. BAIL_ON_WIN32_ERROR(dwError);
  1083. }
  1084. pSessionCont = pSessionCont->pNext;
  1085. }
  1086. error:
  1087. return (dwError);
  1088. }
  1089. DWORD
  1090. WZCGetTableDataHandle(
  1091. JET_SESID * pMyJetServerSession,
  1092. JET_DBID * pMyJetDatabaseHandle,
  1093. JET_TABLEID * pMyClientTableHandle
  1094. )
  1095. {
  1096. DWORD dwError = ERROR_SUCCESS;
  1097. DWORD JetError = JET_errSuccess;
  1098. //
  1099. // Create a new table. It will be opened in exclusive mode by
  1100. // Jet Engine.
  1101. //
  1102. dwError = WZCCreateTableData(
  1103. *pMyJetServerSession,
  1104. *pMyJetDatabaseHandle,
  1105. pMyClientTableHandle
  1106. );
  1107. if (dwError != JET_errTableDuplicate) {
  1108. BAIL_ON_WIN32_ERROR(dwError);
  1109. //
  1110. // Close the table since it is exclusively locked now.
  1111. //
  1112. JetError = JetCloseTable(
  1113. *pMyJetServerSession,
  1114. *pMyClientTableHandle
  1115. );
  1116. dwError = WZCMapJetError(JetError, "JetCloseTable");
  1117. if (dwError != ERROR_SUCCESS) {
  1118. ASSERT(FALSE);
  1119. }
  1120. BAIL_ON_WIN32_ERROR(dwError);
  1121. *pMyClientTableHandle = 0;
  1122. }
  1123. *pMyClientTableHandle = 0;
  1124. //
  1125. // Reopen the table in non-exclusive mode.
  1126. //
  1127. dwError = WZCOpenTableData(
  1128. *pMyJetServerSession,
  1129. *pMyJetDatabaseHandle,
  1130. pMyClientTableHandle
  1131. );
  1132. BAIL_ON_WIN32_ERROR(dwError);
  1133. error:
  1134. return (dwError);
  1135. }
  1136. DWORD
  1137. IniEnumWZCDbLogRecordsSummary(
  1138. PSESSION_CONTAINER pSessionCont,
  1139. PBOOL pbEnumFromStart,
  1140. DWORD dwPreferredNumEntries,
  1141. PWZC_DB_RECORD * ppWZCRecords,
  1142. LPDWORD pdwNumRecords
  1143. )
  1144. {
  1145. DWORD dwError = 0;
  1146. DWORD dwNumToEnum = 0;
  1147. PWZC_DB_RECORD pWZCRecords = NULL;
  1148. JET_SESID * pMyJetServerSession = NULL;
  1149. JET_DBID * pMyJetDatabaseHandle = NULL;
  1150. JET_TABLEID * pMyClientTableHandle = NULL;
  1151. DWORD i = 0;
  1152. PWZC_DB_RECORD pCurWZCRecord = NULL;
  1153. JET_ERR JetError = JET_errSuccess;
  1154. DWORD dwReqSize = 0;
  1155. char cTempBuf[MAX_RAW_DATA_SIZE];
  1156. DWORD dwCurIndex = 0;
  1157. BOOL bEnumFromStart = FALSE;
  1158. if (!dwPreferredNumEntries ||
  1159. (dwPreferredNumEntries > MAX_RECORD_ENUM_COUNT)) {
  1160. dwNumToEnum = MAX_RECORD_ENUM_COUNT;
  1161. }
  1162. else {
  1163. dwNumToEnum = dwPreferredNumEntries;
  1164. }
  1165. pWZCRecords = RpcCAlloc(sizeof(WZC_DB_RECORD)*dwNumToEnum);
  1166. if (!pWZCRecords) {
  1167. dwError = ERROR_OUTOFMEMORY;
  1168. BAIL_ON_WIN32_ERROR(dwError);
  1169. }
  1170. memset(pWZCRecords, 0, sizeof(WZC_DB_RECORD)*dwNumToEnum);
  1171. pMyJetServerSession = (JET_SESID *) &(pSessionCont->SessionID);
  1172. pMyJetDatabaseHandle = (JET_DBID *) &(pSessionCont->DbID);
  1173. pMyClientTableHandle = (JET_TABLEID *) &(pSessionCont->TableID);
  1174. if (!(*pMyClientTableHandle)) {
  1175. JetError = JetOpenTable(
  1176. *pMyJetServerSession,
  1177. *pMyJetDatabaseHandle,
  1178. LOG_RECORD_TABLE,
  1179. NULL,
  1180. 0,
  1181. 0,
  1182. pMyClientTableHandle
  1183. );
  1184. dwError = WZCMapJetError(JetError, "JetOpenTable");
  1185. BAIL_ON_WIN32_ERROR(dwError);
  1186. }
  1187. bEnumFromStart = *pbEnumFromStart;
  1188. if (bEnumFromStart) {
  1189. dwError = WZCJetPrepareSearch(
  1190. *pMyJetServerSession,
  1191. *pMyClientTableHandle,
  1192. gLogRecordTable[TIMESTAMP_IDX].ColName,
  1193. bEnumFromStart,
  1194. NULL,
  1195. 0
  1196. );
  1197. BAIL_ON_WIN32_ERROR(dwError);
  1198. bEnumFromStart = FALSE;
  1199. }
  1200. for (i = 0; i < dwNumToEnum; i++) {
  1201. pCurWZCRecord = (pWZCRecords + i);
  1202. dwError = WZCJetGetValue(
  1203. *pMyJetServerSession,
  1204. *pMyClientTableHandle,
  1205. gLogRecordTable[RECORD_IDX_IDX].ColHandle,
  1206. &(pCurWZCRecord->recordid),
  1207. sizeof(pCurWZCRecord->recordid),
  1208. &dwReqSize
  1209. );
  1210. BAIL_ON_WIN32_ERROR(dwError);
  1211. dwError = WZCJetGetValue(
  1212. *pMyJetServerSession,
  1213. *pMyClientTableHandle,
  1214. gLogRecordTable[COMPONENT_ID_IDX].ColHandle,
  1215. &(pCurWZCRecord->componentid),
  1216. sizeof(pCurWZCRecord->componentid),
  1217. &dwReqSize
  1218. );
  1219. BAIL_ON_WIN32_ERROR(dwError);
  1220. dwError = WZCJetGetValue(
  1221. *pMyJetServerSession,
  1222. *pMyClientTableHandle,
  1223. gLogRecordTable[CATEGORY_IDX].ColHandle,
  1224. &(pCurWZCRecord->category),
  1225. sizeof(pCurWZCRecord->category),
  1226. &dwReqSize
  1227. );
  1228. BAIL_ON_WIN32_ERROR(dwError);
  1229. dwError = WZCJetGetValue(
  1230. *pMyJetServerSession,
  1231. *pMyClientTableHandle,
  1232. gLogRecordTable[TIMESTAMP_IDX].ColHandle,
  1233. &(pCurWZCRecord->timestamp),
  1234. sizeof(pCurWZCRecord->timestamp),
  1235. &dwReqSize
  1236. );
  1237. BAIL_ON_WIN32_ERROR(dwError);
  1238. dwReqSize = 0;
  1239. dwError = WZCJetGetValue(
  1240. *pMyJetServerSession,
  1241. *pMyClientTableHandle,
  1242. gLogRecordTable[INTERFACE_MAC_IDX].ColHandle,
  1243. cTempBuf,
  1244. MAX_RAW_DATA_SIZE,
  1245. &dwReqSize
  1246. );
  1247. BAIL_ON_WIN32_ERROR(dwError);
  1248. if (dwReqSize > 0) {
  1249. (pCurWZCRecord->localmac).pData = RpcCAlloc(dwReqSize);
  1250. if (!((pCurWZCRecord->localmac).pData)) {
  1251. dwError = ERROR_OUTOFMEMORY;
  1252. BAIL_ON_WIN32_ERROR(dwError);
  1253. }
  1254. memcpy((pCurWZCRecord->localmac).pData, cTempBuf, dwReqSize);
  1255. (pCurWZCRecord->localmac).dwDataLen = dwReqSize;
  1256. }
  1257. dwReqSize = 0;
  1258. dwError = WZCJetGetValue(
  1259. *pMyJetServerSession,
  1260. *pMyClientTableHandle,
  1261. gLogRecordTable[DEST_MAC_IDX].ColHandle,
  1262. cTempBuf,
  1263. MAX_RAW_DATA_SIZE,
  1264. &dwReqSize
  1265. );
  1266. BAIL_ON_WIN32_ERROR(dwError);
  1267. if (dwReqSize > 0) {
  1268. (pCurWZCRecord->remotemac).pData = RpcCAlloc(dwReqSize);
  1269. if (!((pCurWZCRecord->remotemac).pData)) {
  1270. dwError = ERROR_OUTOFMEMORY;
  1271. BAIL_ON_WIN32_ERROR(dwError);
  1272. }
  1273. memcpy((pCurWZCRecord->remotemac).pData, cTempBuf, dwReqSize);
  1274. (pCurWZCRecord->remotemac).dwDataLen = dwReqSize;
  1275. }
  1276. dwReqSize = 0;
  1277. dwError = WZCJetGetValue(
  1278. *pMyJetServerSession,
  1279. *pMyClientTableHandle,
  1280. gLogRecordTable[SSID_IDX].ColHandle,
  1281. cTempBuf,
  1282. MAX_RAW_DATA_SIZE,
  1283. &dwReqSize
  1284. );
  1285. BAIL_ON_WIN32_ERROR(dwError);
  1286. if (dwReqSize > 0) {
  1287. (pCurWZCRecord->ssid).pData = RpcCAlloc(dwReqSize);
  1288. if (!((pCurWZCRecord->ssid).pData)) {
  1289. dwError = ERROR_OUTOFMEMORY;
  1290. BAIL_ON_WIN32_ERROR(dwError);
  1291. }
  1292. memcpy((pCurWZCRecord->ssid).pData, cTempBuf, dwReqSize);
  1293. (pCurWZCRecord->ssid).dwDataLen = dwReqSize;
  1294. }
  1295. dwReqSize = 0;
  1296. dwError = WZCJetGetValue(
  1297. *pMyJetServerSession,
  1298. *pMyClientTableHandle,
  1299. gLogRecordTable[MESSAGE_IDX].ColHandle,
  1300. cTempBuf,
  1301. MAX_RAW_DATA_SIZE,
  1302. &dwReqSize
  1303. );
  1304. BAIL_ON_WIN32_ERROR(dwError);
  1305. if (dwReqSize > 0) {
  1306. //
  1307. // only get (up to) MAX_SUMMARY_MESSAGE_SIZE message data
  1308. //
  1309. dwReqSize = dwReqSize <= MAX_SUMMARY_MESSAGE_SIZE ?
  1310. dwReqSize : MAX_SUMMARY_MESSAGE_SIZE;
  1311. (pCurWZCRecord->message).pData = RpcCAlloc(dwReqSize + 2);
  1312. ZeroMemory((pCurWZCRecord->message).pData, dwReqSize + 2);
  1313. if (!((pCurWZCRecord->message).pData)) {
  1314. dwError = ERROR_OUTOFMEMORY;
  1315. BAIL_ON_WIN32_ERROR(dwError);
  1316. }
  1317. memcpy((pCurWZCRecord->message).pData, cTempBuf, dwReqSize);
  1318. (pCurWZCRecord->message).dwDataLen = dwReqSize + 2;
  1319. }
  1320. //
  1321. // do not get context at all
  1322. //
  1323. (pCurWZCRecord->context).pData = NULL;
  1324. (pCurWZCRecord->context).dwDataLen = 0;
  1325. JetError = JetMove(
  1326. *pMyJetServerSession,
  1327. *pMyClientTableHandle,
  1328. JET_MoveNext,
  1329. 0
  1330. );
  1331. //
  1332. // Don't bail from here as the end of the table (logical or physical)
  1333. // is caught in the next call.
  1334. //
  1335. dwError = WZCJetGetValue(
  1336. *pMyJetServerSession,
  1337. *pMyClientTableHandle,
  1338. gLogRecordTable[RECORD_IDX_IDX].ColHandle,
  1339. &dwCurIndex,
  1340. sizeof(dwCurIndex),
  1341. &dwReqSize
  1342. );
  1343. if (dwCurIndex == gdwCurrentHeader || dwError != ERROR_SUCCESS) {
  1344. JetError = JetMove(
  1345. *pMyJetServerSession,
  1346. *pMyClientTableHandle,
  1347. JET_MoveLast,
  1348. 0
  1349. );
  1350. dwError = WZCMapJetError(JetError, "JetMove");
  1351. if (dwError == ERROR_SUCCESS)
  1352. dwError = ERROR_NO_MORE_ITEMS;
  1353. i++;
  1354. break;
  1355. }
  1356. }
  1357. *pbEnumFromStart = bEnumFromStart;
  1358. *ppWZCRecords = pWZCRecords;
  1359. *pdwNumRecords = i;
  1360. return (dwError);
  1361. error:
  1362. if (pWZCRecords) {
  1363. FreeWZCRecords(pWZCRecords, dwNumToEnum);
  1364. }
  1365. *ppWZCRecords = NULL;
  1366. *pdwNumRecords = 0;
  1367. return (dwError);
  1368. }
  1369. DWORD
  1370. EnumWZCDbLogRecordsSummary(
  1371. HANDLE hSession,
  1372. PWZC_DB_RECORD pTemplateRecord,
  1373. PBOOL pbEnumFromStart,
  1374. DWORD dwPreferredNumEntries,
  1375. PWZC_DB_RECORD * ppWZCRecords,
  1376. LPDWORD pdwNumRecords,
  1377. LPVOID pvReserved
  1378. )
  1379. {
  1380. DWORD Error = 0;
  1381. PSESSION_CONTAINER pSessionCont = NULL;
  1382. AcquireSharedLock(gpWZCDbSessionRWLock);
  1383. Error = GetSessionContainer(hSession, &pSessionCont);
  1384. BAIL_ON_LOCK_ERROR(Error);
  1385. if (pTemplateRecord) {
  1386. Error = ERROR_NOT_SUPPORTED;
  1387. }
  1388. else {
  1389. Error = IniEnumWZCDbLogRecordsSummary(
  1390. pSessionCont,
  1391. pbEnumFromStart,
  1392. dwPreferredNumEntries,
  1393. ppWZCRecords,
  1394. pdwNumRecords
  1395. );
  1396. }
  1397. BAIL_ON_LOCK_ERROR(Error);
  1398. ReleaseSharedLock(gpWZCDbSessionRWLock);
  1399. return (Error);
  1400. lock:
  1401. ReleaseSharedLock(gpWZCDbSessionRWLock);
  1402. return (Error);
  1403. }
  1404. DWORD
  1405. GetWZCDbLogRecord(
  1406. HANDLE hSession,
  1407. PWZC_DB_RECORD pTemplateRecord,
  1408. PWZC_DB_RECORD * ppWZCRecords,
  1409. LPVOID pvReserved
  1410. )
  1411. {
  1412. DWORD Error = 0;
  1413. PSESSION_CONTAINER pSessionCont = NULL;
  1414. SESSION_CONTAINER mySessionCont;
  1415. AcquireSharedLock(gpWZCDbSessionRWLock);
  1416. Error = GetSessionContainer(hSession, &pSessionCont);
  1417. BAIL_ON_LOCK_ERROR(Error);
  1418. ZeroMemory(&mySessionCont, sizeof(SESSION_CONTAINER));
  1419. Error = IniOpenWZCDbLogSession(&mySessionCont);
  1420. BAIL_ON_LOCK_ERROR(Error);
  1421. if (!pTemplateRecord) {
  1422. Error = ERROR_INVALID_HANDLE;
  1423. }
  1424. else {
  1425. Error = IniGetWZCDbLogRecord(
  1426. &mySessionCont,
  1427. pTemplateRecord,
  1428. ppWZCRecords
  1429. );
  1430. }
  1431. BAIL_ON_LOCK_ERROR(Error);
  1432. Error = IniCloseWZCDbLogSession(&mySessionCont);
  1433. BAIL_ON_LOCK_ERROR(Error);
  1434. ReleaseSharedLock(gpWZCDbSessionRWLock);
  1435. return (Error);
  1436. lock:
  1437. ReleaseSharedLock(gpWZCDbSessionRWLock);
  1438. return (Error);
  1439. };
  1440. DWORD
  1441. IniGetWZCDbLogRecord(
  1442. PSESSION_CONTAINER pSessionCont,
  1443. PWZC_DB_RECORD pTemplateRecord,
  1444. PWZC_DB_RECORD * ppWZCRecords
  1445. )
  1446. {
  1447. DWORD dwError = 0;
  1448. PWZC_DB_RECORD pWZCRecords = NULL;
  1449. JET_SESID * pMyJetServerSession = NULL;
  1450. JET_DBID * pMyJetDatabaseHandle = NULL;
  1451. JET_TABLEID * pMyClientTableHandle = NULL;
  1452. PWZC_DB_RECORD pCurWZCRecord = NULL;
  1453. JET_ERR JetError = JET_errSuccess;
  1454. DWORD dwReqSize = 0;
  1455. char cTempBuf[MAX_RAW_DATA_SIZE];
  1456. pWZCRecords = RpcCAlloc(sizeof(WZC_DB_RECORD));
  1457. if (!pWZCRecords) {
  1458. dwError = ERROR_OUTOFMEMORY;
  1459. BAIL_ON_WIN32_ERROR(dwError);
  1460. }
  1461. memset(pWZCRecords, 0, sizeof(WZC_DB_RECORD));
  1462. pMyJetServerSession = (JET_SESID *) &(pSessionCont->SessionID);
  1463. pMyJetDatabaseHandle = (JET_DBID *) &(pSessionCont->DbID);
  1464. pMyClientTableHandle = (JET_TABLEID *) &(pSessionCont->TableID);
  1465. if (!(*pMyClientTableHandle)) {
  1466. JetError = JetOpenTable(
  1467. *pMyJetServerSession,
  1468. *pMyJetDatabaseHandle,
  1469. LOG_RECORD_TABLE,
  1470. NULL,
  1471. 0,
  1472. 0,
  1473. pMyClientTableHandle
  1474. );
  1475. dwError = WZCMapJetError(JetError, "JetOpenTable");
  1476. BAIL_ON_WIN32_ERROR(dwError);
  1477. }
  1478. //
  1479. // seek to the perticular position
  1480. //
  1481. dwError = WZCSeekRecordOnIndexTime(
  1482. *pMyJetServerSession,
  1483. *pMyClientTableHandle,
  1484. pTemplateRecord->recordid,
  1485. pTemplateRecord->timestamp
  1486. );
  1487. if (dwError != ERROR_SUCCESS)
  1488. dwError = ERROR_NO_MORE_ITEMS;
  1489. BAIL_ON_WIN32_ERROR(dwError);
  1490. pCurWZCRecord = pWZCRecords;
  1491. dwError = WZCJetGetValue(
  1492. *pMyJetServerSession,
  1493. *pMyClientTableHandle,
  1494. gLogRecordTable[RECORD_IDX_IDX].ColHandle,
  1495. &(pCurWZCRecord->recordid),
  1496. sizeof(pCurWZCRecord->recordid),
  1497. &dwReqSize
  1498. );
  1499. BAIL_ON_WIN32_ERROR(dwError);
  1500. dwError = WZCJetGetValue(
  1501. *pMyJetServerSession,
  1502. *pMyClientTableHandle,
  1503. gLogRecordTable[COMPONENT_ID_IDX].ColHandle,
  1504. &(pCurWZCRecord->componentid),
  1505. sizeof(pCurWZCRecord->componentid),
  1506. &dwReqSize
  1507. );
  1508. BAIL_ON_WIN32_ERROR(dwError);
  1509. dwError = WZCJetGetValue(
  1510. *pMyJetServerSession,
  1511. *pMyClientTableHandle,
  1512. gLogRecordTable[CATEGORY_IDX].ColHandle,
  1513. &(pCurWZCRecord->category),
  1514. sizeof(pCurWZCRecord->category),
  1515. &dwReqSize
  1516. );
  1517. BAIL_ON_WIN32_ERROR(dwError);
  1518. dwError = WZCJetGetValue(
  1519. *pMyJetServerSession,
  1520. *pMyClientTableHandle,
  1521. gLogRecordTable[TIMESTAMP_IDX].ColHandle,
  1522. &(pCurWZCRecord->timestamp),
  1523. sizeof(pCurWZCRecord->timestamp),
  1524. &dwReqSize
  1525. );
  1526. BAIL_ON_WIN32_ERROR(dwError);
  1527. dwReqSize = 0;
  1528. dwError = WZCJetGetValue(
  1529. *pMyJetServerSession,
  1530. *pMyClientTableHandle,
  1531. gLogRecordTable[INTERFACE_MAC_IDX].ColHandle,
  1532. cTempBuf,
  1533. MAX_RAW_DATA_SIZE,
  1534. &dwReqSize
  1535. );
  1536. BAIL_ON_WIN32_ERROR(dwError);
  1537. if (dwReqSize > 0) {
  1538. (pCurWZCRecord->localmac).pData = RpcCAlloc(dwReqSize);
  1539. if (!((pCurWZCRecord->localmac).pData)) {
  1540. dwError = ERROR_OUTOFMEMORY;
  1541. BAIL_ON_WIN32_ERROR(dwError);
  1542. }
  1543. memcpy((pCurWZCRecord->localmac).pData, cTempBuf, dwReqSize);
  1544. (pCurWZCRecord->localmac).dwDataLen = dwReqSize;
  1545. }
  1546. dwReqSize = 0;
  1547. dwError = WZCJetGetValue(
  1548. *pMyJetServerSession,
  1549. *pMyClientTableHandle,
  1550. gLogRecordTable[DEST_MAC_IDX].ColHandle,
  1551. cTempBuf,
  1552. MAX_RAW_DATA_SIZE,
  1553. &dwReqSize
  1554. );
  1555. BAIL_ON_WIN32_ERROR(dwError);
  1556. if (dwReqSize > 0) {
  1557. (pCurWZCRecord->remotemac).pData = RpcCAlloc(dwReqSize);
  1558. if (!((pCurWZCRecord->remotemac).pData)) {
  1559. dwError = ERROR_OUTOFMEMORY;
  1560. BAIL_ON_WIN32_ERROR(dwError);
  1561. }
  1562. memcpy((pCurWZCRecord->remotemac).pData, cTempBuf, dwReqSize);
  1563. (pCurWZCRecord->remotemac).dwDataLen = dwReqSize;
  1564. }
  1565. dwReqSize = 0;
  1566. dwError = WZCJetGetValue(
  1567. *pMyJetServerSession,
  1568. *pMyClientTableHandle,
  1569. gLogRecordTable[SSID_IDX].ColHandle,
  1570. cTempBuf,
  1571. MAX_RAW_DATA_SIZE,
  1572. &dwReqSize
  1573. );
  1574. BAIL_ON_WIN32_ERROR(dwError);
  1575. if (dwReqSize > 0) {
  1576. (pCurWZCRecord->ssid).pData = RpcCAlloc(dwReqSize);
  1577. if (!((pCurWZCRecord->ssid).pData)) {
  1578. dwError = ERROR_OUTOFMEMORY;
  1579. BAIL_ON_WIN32_ERROR(dwError);
  1580. }
  1581. memcpy((pCurWZCRecord->ssid).pData, cTempBuf, dwReqSize);
  1582. (pCurWZCRecord->ssid).dwDataLen = dwReqSize;
  1583. }
  1584. dwReqSize = 0;
  1585. dwError = WZCJetGetValue(
  1586. *pMyJetServerSession,
  1587. *pMyClientTableHandle,
  1588. gLogRecordTable[MESSAGE_IDX].ColHandle,
  1589. cTempBuf,
  1590. MAX_RAW_DATA_SIZE,
  1591. &dwReqSize
  1592. );
  1593. BAIL_ON_WIN32_ERROR(dwError);
  1594. if (dwReqSize > 0) {
  1595. (pCurWZCRecord->message).pData = RpcCAlloc(dwReqSize);
  1596. ZeroMemory((pCurWZCRecord->message).pData, dwReqSize);
  1597. if (!((pCurWZCRecord->message).pData)) {
  1598. dwError = ERROR_OUTOFMEMORY;
  1599. BAIL_ON_WIN32_ERROR(dwError);
  1600. }
  1601. memcpy((pCurWZCRecord->message).pData, cTempBuf, dwReqSize);
  1602. (pCurWZCRecord->message).dwDataLen = dwReqSize;
  1603. }
  1604. dwReqSize = 0;
  1605. dwError = WZCJetGetValue(
  1606. *pMyJetServerSession,
  1607. *pMyClientTableHandle,
  1608. gLogRecordTable[CONTEXT_IDX].ColHandle,
  1609. cTempBuf,
  1610. MAX_RAW_DATA_SIZE,
  1611. &dwReqSize
  1612. );
  1613. BAIL_ON_WIN32_ERROR(dwError);
  1614. if (dwReqSize > 0) {
  1615. (pCurWZCRecord->context).pData = RpcCAlloc(dwReqSize);
  1616. if (!((pCurWZCRecord->context).pData)) {
  1617. dwError = ERROR_OUTOFMEMORY;
  1618. BAIL_ON_WIN32_ERROR(dwError);
  1619. }
  1620. memcpy((pCurWZCRecord->context).pData, cTempBuf, dwReqSize);
  1621. (pCurWZCRecord->context).dwDataLen = dwReqSize;
  1622. }
  1623. *ppWZCRecords = pWZCRecords;
  1624. return (dwError);
  1625. error:
  1626. if (pWZCRecords) {
  1627. FreeWZCRecords(pWZCRecords, 1);
  1628. }
  1629. *ppWZCRecords = NULL;
  1630. return (dwError);
  1631. }
  1632. DWORD
  1633. WZCSeekRecordOnIndexTime(
  1634. JET_SESID JetServerSession,
  1635. JET_TABLEID JetTableHandle,
  1636. DWORD dwIndex,
  1637. FILETIME ftTimeStamp
  1638. )
  1639. /*++
  1640. Routine Description:
  1641. This function seeks a record based on index and timestamp
  1642. Arguments:
  1643. JetServerSession - Server session id.
  1644. JetTableHandle - Table handle.
  1645. dwIndex - record index
  1646. ftTimeStamp - record timestamp
  1647. Return Value:
  1648. Winerror code.
  1649. --*/
  1650. {
  1651. JET_ERR JetError = JET_errSuccess;
  1652. DWORD Error = 0;
  1653. LONG lErr = 0;
  1654. DWORD dwKeySize = sizeof (dwIndex);
  1655. DWORD dwReqSize = 0;
  1656. FILETIME ftMyTimeStamp;
  1657. JetError = JetSetCurrentIndex(
  1658. JetServerSession,
  1659. JetTableHandle,
  1660. gLogRecordTable[RECORD_IDX_IDX].ColName
  1661. );
  1662. Error = WZCMapJetError(JetError, "JetPrepareSearch: JetSetCurrentIndex");
  1663. if (Error != ERROR_SUCCESS) {
  1664. WZCMapJetError(JetError, gLogRecordTable[RECORD_IDX_IDX].ColName);
  1665. return (Error);
  1666. }
  1667. JetError = JetMove(
  1668. JetServerSession,
  1669. JetTableHandle,
  1670. JET_MoveFirst,
  1671. 0
  1672. );
  1673. Error = WZCMapJetError(JetError, "JetPrepareSearch: JetMove");
  1674. if (Error != ERROR_SUCCESS) {
  1675. WZCMapJetError(JetError, gLogRecordTable[RECORD_IDX_IDX].ColName);
  1676. return (Error);
  1677. }
  1678. JetError = JetMakeKey(
  1679. JetServerSession,
  1680. JetTableHandle,
  1681. &dwIndex,
  1682. dwKeySize,
  1683. JET_bitNewKey
  1684. );
  1685. Error = WZCMapJetError(JetError, "JetPrepareSearch: JetMakeKey");
  1686. if (Error != ERROR_SUCCESS) {
  1687. WZCMapJetError(JetError, gLogRecordTable[RECORD_IDX_IDX].ColName);
  1688. return (Error);
  1689. }
  1690. JetError = JetSeek(
  1691. JetServerSession,
  1692. JetTableHandle,
  1693. JET_bitSeekEQ
  1694. );
  1695. Error = WZCMapJetError(JetError, "JetPrepareSearch: JetMove / JetSeek");
  1696. if (Error == ERROR_SUCCESS) {
  1697. dwReqSize = 0;
  1698. Error = WZCJetGetValue(
  1699. JetServerSession,
  1700. JetTableHandle,
  1701. gLogRecordTable[TIMESTAMP_IDX].ColHandle,
  1702. &ftMyTimeStamp,
  1703. sizeof(ftMyTimeStamp),
  1704. &dwReqSize
  1705. );
  1706. if (Error == ERROR_SUCCESS) {
  1707. lErr = CompareFileTime(
  1708. &ftMyTimeStamp,
  1709. &ftTimeStamp
  1710. );
  1711. if (lErr != 0)
  1712. Error = ERROR_NO_MORE_ITEMS;
  1713. }
  1714. }
  1715. return (Error);
  1716. }