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.

747 lines
22 KiB

  1. /*++
  2. Copyright (c) 1990 Microsoft Corporation
  3. Module Name:
  4. bowmastr.c
  5. Abstract:
  6. This module implements all of the master browser related routines for the
  7. NT browser
  8. Author:
  9. Larry Osterman (LarryO) 21-Jun-1990
  10. Revision History:
  11. 21-Jun-1990 LarryO
  12. Created
  13. --*/
  14. #include "precomp.h"
  15. #pragma hdrstop
  16. #define INCLUDE_SMB_TRANSACTION
  17. NTSTATUS
  18. StartProcessingAnnouncements(
  19. IN PTRANSPORT_NAME TransportName,
  20. IN PVOID Context
  21. );
  22. VOID
  23. BowserMasterAnnouncementWorker(
  24. IN PVOID Ctx
  25. );
  26. NTSTATUS
  27. TimeoutFindMasterRequests(
  28. IN PTRANSPORT Transport,
  29. IN PVOID Context
  30. );
  31. NTSTATUS
  32. BowserPrimeDomainTableWithOtherDomains(
  33. IN PTRANSPORT_NAME TransportName,
  34. IN PVOID Context
  35. );
  36. #ifdef ALLOC_PRAGMA
  37. #pragma alloc_text(PAGE, BowserBecomeMaster)
  38. #pragma alloc_text(PAGE, StartProcessingAnnouncements)
  39. #pragma alloc_text(PAGE, BowserPrimeDomainTableWithOtherDomains)
  40. #pragma alloc_text(PAGE, BowserNewMaster)
  41. #pragma alloc_text(PAGE, BowserCompleteFindMasterRequests)
  42. #pragma alloc_text(PAGE, BowserTimeoutFindMasterRequests)
  43. #pragma alloc_text(PAGE, TimeoutFindMasterRequests)
  44. #pragma alloc_text(PAGE, BowserMasterAnnouncementWorker)
  45. #endif
  46. NTSTATUS
  47. BowserBecomeMaster(
  48. IN PTRANSPORT Transport
  49. )
  50. /*++
  51. Routine Description:
  52. Make this machine a master browser.
  53. This routine is called when we are changing the state of a machine from
  54. backup to master browser.
  55. Arguments:
  56. Transport - The transport on which to become a master.
  57. Return Value
  58. NTSTATUS - The status of the upgrade operation.
  59. --*/
  60. {
  61. NTSTATUS Status = STATUS_UNSUCCESSFUL;
  62. PPAGED_TRANSPORT PagedTransport = Transport->PagedTransport;
  63. PAGED_CODE();
  64. try {
  65. LOCK_TRANSPORT(Transport);
  66. BowserReferenceDiscardableCode( BowserDiscardableCodeSection );
  67. //
  68. // Post the addname on this transport for the master name..
  69. //
  70. Status = BowserAllocateName(
  71. &Transport->DomainInfo->DomUnicodeDomainName,
  72. MasterBrowser,
  73. Transport,
  74. Transport->DomainInfo );
  75. if (NT_SUCCESS(Status)) {
  76. //
  77. // Post the addname on this transport for the domain announcement.
  78. //
  79. // set the status to unsuccessful
  80. // so that we dont think we succeeded if an exception occurs later in the function
  81. Status = STATUS_UNSUCCESSFUL;
  82. Status = BowserAllocateName(&Transport->DomainInfo->DomUnicodeDomainName,
  83. DomainAnnouncement,
  84. Transport,
  85. Transport->DomainInfo );
  86. }
  87. //
  88. // The addition of the name failed - we can't be a master any
  89. // more.
  90. //
  91. if (!NT_SUCCESS(Status)) {
  92. try_return(Status);
  93. }
  94. PagedTransport->Role = Master;
  95. //
  96. // Start processing host announcements on each of
  97. // the names associated with the server.
  98. //
  99. BowserForEachTransportName(Transport, StartProcessingAnnouncements, NULL);
  100. //
  101. // If we don't have any elements in our announcement table,
  102. // send a request announcement packet to all the servers to
  103. // allow ourselves to populate the table as quickly as possible.
  104. //
  105. #ifdef ENABLE_PSEUDO_BROWSER
  106. if ((RtlNumberGenericTableElements(&PagedTransport->AnnouncementTable) == 0) &&
  107. PagedTransport->NumberOfServersInTable == 0 &&
  108. BowserData.PseudoServerLevel != BROWSER_PSEUDO) {
  109. #else
  110. if ((RtlNumberGenericTableElements(&PagedTransport->AnnouncementTable) == 0) &&
  111. PagedTransport->NumberOfServersInTable == 0) {
  112. #endif
  113. BowserSendRequestAnnouncement(&Transport->DomainInfo->DomUnicodeDomainName,
  114. PrimaryDomain,
  115. Transport);
  116. }
  117. //
  118. // If we don't have any elements in our domain table,
  119. // send a request announcement packet to all the servers to
  120. // allow ourselves to populate the table as quickly as possible.
  121. //
  122. #ifdef ENABLE_PSEUDO_BROWSER
  123. if ((RtlNumberGenericTableElements(&PagedTransport->DomainTable) == 0) &&
  124. PagedTransport->NumberOfServersInTable == 0 &&
  125. BowserData.PseudoServerLevel != BROWSER_PSEUDO) {
  126. #else
  127. if ((RtlNumberGenericTableElements(&PagedTransport->DomainTable) == 0) &&
  128. PagedTransport->NumberOfServersInTable == 0) {
  129. #endif
  130. BowserSendRequestAnnouncement(&Transport->DomainInfo->DomUnicodeDomainName,
  131. DomainAnnouncement,
  132. Transport);
  133. }
  134. PagedTransport->TimeMaster = BowserTimeUp();
  135. //
  136. // Now walk the transport names associated with this transport and
  137. // seed all the "otherdomains" into the browse list.
  138. //
  139. BowserForEachTransportName(
  140. Transport,
  141. BowserPrimeDomainTableWithOtherDomains,
  142. NULL);
  143. //
  144. // Now complete any and all find master requests outstanding on this
  145. // transport.
  146. //
  147. BowserCompleteFindMasterRequests(Transport, &Transport->DomainInfo->DomUnicodeComputerName, STATUS_REQUEST_NOT_ACCEPTED);
  148. try_return(Status = STATUS_SUCCESS);
  149. try_exit:NOTHING;
  150. } finally {
  151. if (!NT_SUCCESS(Status)) {
  152. dlog(DPRT_ELECT|DPRT_MASTER,
  153. ("%s: %ws: There's already a master on this net - we need to find who it is",
  154. Transport->DomainInfo->DomOemDomainName,
  155. PagedTransport->TransportName.Buffer ));
  156. //
  157. // We couldn't become a master. Reset our state and fail the
  158. // promotion request.
  159. //
  160. PagedTransport->Role = PotentialBackup;
  161. PagedTransport->ElectionCount = ELECTION_COUNT;
  162. PagedTransport->Uptime = BowserTimeUp();
  163. Transport->ElectionState = Idle;
  164. //
  165. // Stop processing host announcements on each of
  166. // the names associated with the server.
  167. //
  168. BowserForEachTransportName(Transport, BowserStopProcessingAnnouncements, NULL);
  169. //
  170. // Stop any timers that are running (ie. if there's an election
  171. // in progress)
  172. //
  173. BowserStopTimer(&Transport->ElectionTimer);
  174. //
  175. // Delete the names we added above.
  176. //
  177. BowserDeleteTransportNameByName(Transport,
  178. NULL,
  179. MasterBrowser);
  180. BowserDeleteTransportNameByName(Transport,
  181. NULL,
  182. DomainAnnouncement);
  183. BowserDereferenceDiscardableCode( BowserDiscardableCodeSection );
  184. }
  185. UNLOCK_TRANSPORT(Transport);
  186. }
  187. return Status;
  188. }
  189. NTSTATUS
  190. StartProcessingAnnouncements(
  191. IN PTRANSPORT_NAME TransportName,
  192. IN PVOID Context
  193. )
  194. {
  195. PAGED_CODE();
  196. ASSERT (TransportName->Signature == STRUCTURE_SIGNATURE_TRANSPORTNAME);
  197. ASSERT (TransportName->NameType == TransportName->PagedTransportName->Name->NameType);
  198. if ((TransportName->NameType == OtherDomain) ||
  199. (TransportName->NameType == MasterBrowser) ||
  200. (TransportName->NameType == PrimaryDomain) ||
  201. (TransportName->NameType == BrowserElection) ||
  202. (TransportName->NameType == DomainAnnouncement)) {
  203. if (!TransportName->ProcessHostAnnouncements) {
  204. BowserReferenceDiscardableCode( BowserDiscardableCodeSection );
  205. DISCARDABLE_CODE( BowserDiscardableCodeSection );
  206. TransportName->ProcessHostAnnouncements = TRUE;
  207. }
  208. }
  209. return(STATUS_SUCCESS);
  210. UNREFERENCED_PARAMETER(Context);
  211. }
  212. NTSTATUS
  213. BowserPrimeDomainTableWithOtherDomains(
  214. IN PTRANSPORT_NAME TransportName,
  215. IN PVOID Context
  216. )
  217. {
  218. PAGED_CODE();
  219. if (TransportName->NameType == OtherDomain) {
  220. PPAGED_TRANSPORT PagedTransport = TransportName->Transport->PagedTransport;
  221. PTRANSPORT Transport = TransportName->Transport;
  222. ANNOUNCE_ENTRY OtherDomainPrototype;
  223. PANNOUNCE_ENTRY Announcement;
  224. BOOLEAN NewElement;
  225. RtlZeroMemory( &OtherDomainPrototype, sizeof(OtherDomainPrototype) );
  226. OtherDomainPrototype.Signature = STRUCTURE_SIGNATURE_ANNOUNCE_ENTRY;
  227. OtherDomainPrototype.Size = sizeof(OtherDomainPrototype) -
  228. sizeof(OtherDomainPrototype.ServerComment) +
  229. Transport->DomainInfo->DomUnicodeComputerName.Length + sizeof(WCHAR);
  230. RtlCopyMemory(OtherDomainPrototype.ServerName, TransportName->PagedTransportName->Name->Name.Buffer, TransportName->PagedTransportName->Name->Name.Length);
  231. OtherDomainPrototype.ServerName[TransportName->PagedTransportName->Name->Name.Length / sizeof(WCHAR)] = UNICODE_NULL;
  232. RtlCopyMemory(OtherDomainPrototype.ServerComment, Transport->DomainInfo->DomUnicodeComputerName.Buffer, Transport->DomainInfo->DomUnicodeComputerName.Length);
  233. OtherDomainPrototype.ServerComment[Transport->DomainInfo->DomUnicodeComputerName.Length / sizeof(WCHAR)] = UNICODE_NULL;
  234. OtherDomainPrototype.ServerType = SV_TYPE_DOMAIN_ENUM;
  235. OtherDomainPrototype.ServerVersionMajor = 2;
  236. OtherDomainPrototype.ServerVersionMinor = 0;
  237. OtherDomainPrototype.ServerPeriodicity = 0xffff;
  238. OtherDomainPrototype.ExpirationTime = 0xffffffff;
  239. OtherDomainPrototype.SerialId = 0;
  240. OtherDomainPrototype.Name = TransportName->PagedTransportName->Name;
  241. //
  242. // Make sure that no-one else is messing with the domain list.
  243. //
  244. LOCK_ANNOUNCE_DATABASE(Transport);
  245. Announcement = RtlInsertElementGenericTable(&PagedTransport->DomainTable,
  246. &OtherDomainPrototype, OtherDomainPrototype.Size, &NewElement);
  247. if (Announcement != NULL && NewElement ) {
  248. // Indicate the name is referenced by the announce entry we just inserted.
  249. BowserReferenceName( OtherDomainPrototype.Name );
  250. }
  251. UNLOCK_ANNOUNCE_DATABASE(Transport);
  252. }
  253. return(STATUS_SUCCESS);
  254. }
  255. VOID
  256. BowserNewMaster(
  257. IN PTRANSPORT Transport,
  258. IN PUCHAR MasterName
  259. )
  260. /*++
  261. Routine Description:
  262. Flag that a machine is the new master browser server.
  263. This routine is called to register a new master browser server.
  264. Arguments:
  265. IN PTRANSPORT Transport - The transport for the net we're on.
  266. IN PUCHAR MasterName - The name of the new master browser server.
  267. Return Value
  268. None.
  269. --*/
  270. {
  271. PIRP Irp = NULL;
  272. WCHAR MasterNameBuffer[LM20_CNLEN+1];
  273. UNICODE_STRING UMasterName;
  274. OEM_STRING OMasterName;
  275. NTSTATUS Status;
  276. PPAGED_TRANSPORT PagedTransport = Transport->PagedTransport;
  277. PAGED_CODE();
  278. UMasterName.Buffer = MasterNameBuffer;
  279. UMasterName.MaximumLength = (LM20_CNLEN+1)*sizeof(WCHAR);
  280. RtlInitAnsiString(&OMasterName, MasterName);
  281. Status = RtlOemStringToUnicodeString(&UMasterName, &OMasterName, FALSE);
  282. if (!NT_SUCCESS(Status)) {
  283. BowserLogIllegalName( Status, OMasterName.Buffer, OMasterName.Length );
  284. return;
  285. }
  286. LOCK_TRANSPORT(Transport);
  287. try {
  288. //
  289. // There's a new master, we can stop our election timers.
  290. //
  291. PagedTransport->ElectionCount = 0;
  292. Transport->ElectionState = Idle;
  293. BowserStopTimer(&Transport->ElectionTimer);
  294. //
  295. // Check to see if we are the winner of the election. If we are
  296. // we want to complete any BecomeMaster requests that are outstanding.
  297. //
  298. if (RtlEqualUnicodeString(&UMasterName, &Transport->DomainInfo->DomUnicodeComputerName, TRUE)) {
  299. //
  300. // We're the new master for this domain. Complete any BecomeMaster
  301. // requests.
  302. //
  303. Irp = BowserDequeueQueuedIrp(&Transport->BecomeMasterQueue);
  304. if (Irp != NULL) {
  305. //
  306. // Don't copy anything into the users buffer.
  307. //
  308. Irp->IoStatus.Information = 0;
  309. BowserCompleteRequest(Irp, STATUS_SUCCESS);
  310. } else {
  311. //
  312. // Go deaf to elections until we can become a master.
  313. //
  314. Transport->ElectionState = DeafToElections;
  315. //
  316. // If we're the master browser, stop being a master browser.
  317. //
  318. //
  319. if (PagedTransport->Role == MasterBrowser) {
  320. //
  321. // Delete the names that make us a master.
  322. //
  323. BowserDeleteTransportNameByName(Transport,
  324. NULL,
  325. MasterBrowser);
  326. BowserDeleteTransportNameByName(Transport,
  327. NULL,
  328. DomainAnnouncement);
  329. }
  330. dlog(DPRT_MASTER,
  331. ("%s: %ws: Unable to find a BecomeMasterIrp\n",
  332. Transport->DomainInfo->DomOemDomainName,
  333. PagedTransport->TransportName.Buffer ));
  334. }
  335. //
  336. // Complete any outstanding find master requests with the special error MORE_PROCESSING_REQUIRED.
  337. //
  338. // This will cause the browser service to promote itself.
  339. //
  340. BowserCompleteFindMasterRequests(Transport, &UMasterName, STATUS_MORE_PROCESSING_REQUIRED);
  341. } else {
  342. BowserCompleteFindMasterRequests(Transport, &UMasterName, STATUS_SUCCESS);
  343. }
  344. } finally {
  345. UNLOCK_TRANSPORT(Transport);
  346. }
  347. }
  348. VOID
  349. BowserCompleteFindMasterRequests(
  350. IN PTRANSPORT Transport,
  351. IN PUNICODE_STRING MasterName,
  352. IN NTSTATUS Status
  353. )
  354. {
  355. PIO_STACK_LOCATION IrpSp;
  356. PIRP Irp = NULL;
  357. BOOLEAN MasterNameChanged;
  358. WCHAR MasterNameBuffer[CNLEN+1];
  359. UNICODE_STRING MasterNameCopy;
  360. NTSTATUS UcaseStatus;
  361. PPAGED_TRANSPORT PagedTransport = Transport->PagedTransport;
  362. PAGED_CODE();
  363. MasterNameCopy.Buffer = MasterNameBuffer;
  364. MasterNameCopy.MaximumLength = sizeof(MasterNameBuffer);
  365. UcaseStatus = RtlUpcaseUnicodeString(&MasterNameCopy, MasterName, FALSE);
  366. if (!NT_SUCCESS(UcaseStatus)) {
  367. BowserLogIllegalName( UcaseStatus, MasterName->Buffer, MasterName->Length );
  368. return;
  369. }
  370. LOCK_TRANSPORT(Transport);
  371. MasterNameChanged = !RtlEqualUnicodeString(&MasterNameCopy, &PagedTransport->MasterName, FALSE);
  372. if (MasterNameChanged) {
  373. //
  374. // If the master name changed, update the masters name in
  375. // the transport structure.
  376. //
  377. RtlCopyUnicodeString(&PagedTransport->MasterName, &MasterNameCopy);
  378. }
  379. UNLOCK_TRANSPORT(Transport);
  380. do {
  381. //
  382. // Complete any the find master requests outstanding against this
  383. // workstation.
  384. //
  385. Irp = BowserDequeueQueuedIrp(&Transport->FindMasterQueue);
  386. if (MasterNameChanged &&
  387. (Irp == NULL)) {
  388. Irp = BowserDequeueQueuedIrp(&Transport->WaitForNewMasterNameQueue);
  389. }
  390. if (Irp != NULL) {
  391. PLMDR_REQUEST_PACKET RequestPacket = Irp->AssociatedIrp.SystemBuffer;
  392. if (NT_SUCCESS(Status)) {
  393. IrpSp = IoGetCurrentIrpStackLocation(Irp);
  394. if (MasterName->Length > (USHORT)(IrpSp->Parameters.DeviceIoControl.OutputBufferLength-
  395. (FIELD_OFFSET(LMDR_REQUEST_PACKET, Parameters.GetMasterName.Name))+3*sizeof(WCHAR)) ) {
  396. Status = STATUS_BUFFER_TOO_SMALL;
  397. } else {
  398. RequestPacket->Parameters.GetMasterName.Name[0] = L'\\';
  399. RequestPacket->Parameters.GetMasterName.Name[1] = L'\\';
  400. RtlCopyMemory(&RequestPacket->Parameters.GetMasterName.Name[2], MasterName->Buffer, MasterName->Length);
  401. RequestPacket->Parameters.GetMasterName.Name[2+(MasterName->Length/sizeof(WCHAR))] = UNICODE_NULL;
  402. }
  403. dlog(DPRT_MASTER,
  404. ("%s: %ws: Completing a find master request with new master %ws\n",
  405. Transport->DomainInfo->DomOemDomainName,
  406. PagedTransport->TransportName.Buffer,
  407. RequestPacket->Parameters.GetMasterName.Name));
  408. RequestPacket->Parameters.GetMasterName.MasterNameLength = MasterName->Length+2*sizeof(WCHAR);
  409. Irp->IoStatus.Information = FIELD_OFFSET(LMDR_REQUEST_PACKET, Parameters.GetMasterName.Name)+MasterName->Length+3*sizeof(WCHAR);
  410. }
  411. BowserCompleteRequest(Irp, Status);
  412. }
  413. } while ( Irp != NULL );
  414. }
  415. DATAGRAM_HANDLER(BowserMasterAnnouncement)
  416. {
  417. PUCHAR MasterName = ((PMASTER_ANNOUNCEMENT_1)Buffer)->MasterName;
  418. ULONG i;
  419. //
  420. // We need to make sure that the incoming packet contains a properly
  421. // terminated ASCII string.
  422. //
  423. for (i = 0; i < BytesAvailable; i++) {
  424. if (MasterName[i] == '\0') {
  425. break;
  426. }
  427. }
  428. if (i == BytesAvailable) {
  429. return(STATUS_REQUEST_NOT_ACCEPTED);
  430. }
  431. return BowserPostDatagramToWorkerThread(
  432. TransportName,
  433. Buffer,
  434. BytesAvailable,
  435. BytesTaken,
  436. SourceAddress,
  437. SourceAddressLength,
  438. SourceName,
  439. SourceNameLength,
  440. BowserMasterAnnouncementWorker,
  441. NonPagedPool,
  442. DelayedWorkQueue,
  443. ReceiveFlags,
  444. FALSE // No response will be sent.
  445. );
  446. }
  447. VOID
  448. BowserMasterAnnouncementWorker(
  449. IN PVOID Ctx
  450. )
  451. {
  452. PPOST_DATAGRAM_CONTEXT Context = Ctx;
  453. PTRANSPORT Transport = Context->TransportName->Transport;
  454. PCHAR LocalMasterName = (PCHAR)((PMASTER_ANNOUNCEMENT_1)Context->Buffer)->MasterName;
  455. size_t cbLocalMasterName;
  456. PIRP Irp;
  457. NTSTATUS Status;
  458. PAGED_CODE();
  459. Irp = BowserDequeueQueuedIrp(&Transport->WaitForMasterAnnounceQueue);
  460. if (Irp != NULL) {
  461. PIO_STACK_LOCATION IrpSp;
  462. PLMDR_REQUEST_PACKET RequestPacket = Irp->AssociatedIrp.SystemBuffer;
  463. IrpSp = IoGetCurrentIrpStackLocation(Irp);
  464. cbLocalMasterName = strlen(LocalMasterName);
  465. if (0 == cbLocalMasterName) {
  466. // ensure we didn't get an invalid NULL announcement
  467. // see bug 440813
  468. // The request completed successfully, but the data is trash.
  469. // - we won't fail the IRP (another one is posted immediately
  470. // upon completion anyway), but not process further this one.
  471. Irp->IoStatus.Information = 0;
  472. Status = STATUS_SUCCESS;
  473. }
  474. else if ((cbLocalMasterName + 1) * sizeof(WCHAR) >
  475. (IrpSp->Parameters.DeviceIoControl.OutputBufferLength -
  476. FIELD_OFFSET(LMDR_REQUEST_PACKET, Parameters.WaitForMasterAnnouncement.Name))) {
  477. //
  478. // ensure there's enough buffer space to return name. If not,
  479. // return error.
  480. //
  481. Irp->IoStatus.Information = 0;
  482. Status = STATUS_BUFFER_TOO_SMALL;
  483. } else {
  484. //
  485. // All is well. Fill info.
  486. //
  487. OEM_STRING MasterName;
  488. UNICODE_STRING MasterNameU;
  489. RtlInitString(&MasterName, LocalMasterName);
  490. Status = RtlOemStringToUnicodeString(&MasterNameU, &MasterName, TRUE);
  491. if ( NT_SUCCESS(Status) ) {
  492. RequestPacket->Parameters.WaitForMasterAnnouncement.MasterNameLength = MasterNameU.Length;
  493. RtlCopyMemory(RequestPacket->Parameters.WaitForMasterAnnouncement.Name, MasterNameU.Buffer, MasterNameU.Length);
  494. RequestPacket->Parameters.WaitForMasterAnnouncement.Name[MasterNameU.Length/sizeof(WCHAR)] = UNICODE_NULL;
  495. Irp->IoStatus.Information = FIELD_OFFSET(LMDR_REQUEST_PACKET, Parameters.WaitForMasterAnnouncement.Name)+MasterNameU.Length + sizeof(UNICODE_NULL);
  496. RtlFreeUnicodeString(&MasterNameU);
  497. Status = STATUS_SUCCESS;
  498. }
  499. }
  500. BowserCompleteRequest(Irp, Status);
  501. }
  502. BowserDereferenceTransportName(Context->TransportName);
  503. BowserDereferenceTransport(Transport);
  504. InterlockedDecrement( &BowserPostedDatagramCount );
  505. FREE_POOL(Context);
  506. }
  507. NTSTATUS
  508. TimeoutFindMasterRequests(
  509. IN PTRANSPORT Transport,
  510. IN PVOID Context
  511. )
  512. {
  513. PAGED_CODE();
  514. //
  515. // Perform an unprotected early out to prevent our calling into
  516. // discardable code section during the scavenger. Since the discardable
  517. // code section is <4K, touching the code would have the effect of
  518. // bringing the entire page into memory, which is a waste - since the
  519. // scavenger runs every 30 seconds, this would cause the discardable
  520. // code section to be a part of the browsers working set.
  521. //
  522. if (BowserIsIrpQueueEmpty(&Transport->FindMasterQueue)) {
  523. return STATUS_SUCCESS;
  524. }
  525. BowserTimeoutQueuedIrp(&Transport->FindMasterQueue, BowserFindMasterTimeout);
  526. return STATUS_SUCCESS;
  527. }
  528. VOID
  529. BowserTimeoutFindMasterRequests(
  530. VOID
  531. )
  532. {
  533. PAGED_CODE();
  534. BowserForEachTransport(TimeoutFindMasterRequests, NULL);
  535. }