Windows NT 4.0 source code leak
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.

225 lines
5.2 KiB

4 years ago
  1. /*++
  2. Copyright (c) 1990 Microsoft Corporation
  3. Module Name:
  4. bowbackp.c
  5. Abstract:
  6. This module implements all of the backup 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. typedef struct _BECOME_BACKUP_CONTEXT {
  18. WORK_QUEUE_ITEM WorkHeader;
  19. PTRANSPORT_NAME TransportName;
  20. PBECOME_BACKUP_1 BecomeBackupRequest;
  21. ULONG BytesAvailable;
  22. } BECOME_BACKUP_CONTEXT, *PBECOME_BACKUP_CONTEXT;
  23. VOID
  24. BowserBecomeBackupWorker(
  25. IN PVOID WorkItem
  26. );
  27. #ifdef ALLOC_PRAGMA
  28. #pragma alloc_text(PAGE, BowserBecomeBackupWorker)
  29. #endif
  30. DATAGRAM_HANDLER(
  31. BowserHandleBecomeBackup
  32. )
  33. /*++
  34. Routine Description:
  35. Indicate that a machine should become a backup browser server.
  36. This routine is called on receipt of a BecomeBackup frame.
  37. Arguments:
  38. IN PTRANSPORT Transport - The transport for the net we're on.
  39. IN PUCHAR MasterName - The name of the new master browser server.
  40. Return Value
  41. None.
  42. --*/
  43. {
  44. PTA_NETBIOS_ADDRESS Address = SourceAddress;
  45. return BowserPostDatagramToWorkerThread(
  46. TransportName,
  47. Buffer,
  48. BytesAvailable,
  49. BytesTaken,
  50. SourceAddress,
  51. SourceAddressLength,
  52. SourceName,
  53. SourceNameLength,
  54. BowserBecomeBackupWorker,
  55. NonPagedPool,
  56. DelayedWorkQueue,
  57. ReceiveFlags,
  58. FALSE // No response will be sent
  59. );
  60. }
  61. VOID
  62. BowserBecomeBackupWorker(
  63. IN PVOID WorkItem
  64. )
  65. {
  66. PPOST_DATAGRAM_CONTEXT Context = WorkItem;
  67. PIRP Irp = NULL;
  68. PTRANSPORT Transport = Context->TransportName->Transport;
  69. UNICODE_STRING UPromoteeName;
  70. OEM_STRING APromoteeName;
  71. PPAGED_TRANSPORT PagedTransport = Transport->PagedTransport;
  72. PBECOME_BACKUP_1 BecomeBackupRequest = Context->Buffer;
  73. PAGED_CODE();
  74. UPromoteeName.Buffer = NULL;
  75. LOCK_TRANSPORT(Transport);
  76. try {
  77. NTSTATUS Status;
  78. RtlInitAnsiString(&APromoteeName, BecomeBackupRequest->BrowserToPromote);
  79. Status = RtlOemStringToUnicodeString(&UPromoteeName, &APromoteeName, TRUE);
  80. if (!NT_SUCCESS(Status)) {
  81. BowserWriteErrorLogEntry(EVENT_BOWSER_NAME_CONVERSION_FAILED, Status, APromoteeName.Buffer, APromoteeName.Length, 0);
  82. try_return(NOTHING);
  83. }
  84. if (RtlEqualUnicodeString(&UPromoteeName, &Transport->ComputerName->PagedTransportName->Name->Name, TRUE)) {
  85. if (PagedTransport->Role == Master) {
  86. BowserWriteErrorLogEntry(EVENT_BOWSER_PROMOTED_WHILE_ALREADY_MASTER,
  87. STATUS_UNSUCCESSFUL,
  88. NULL,
  89. 0,
  90. 0);
  91. try_return(NOTHING);
  92. }
  93. //
  94. // Ignore become backup requests on point-to-point (RAS) links and
  95. // transports which are actually duplicates of others.
  96. //
  97. if (PagedTransport->DisabledTransport) {
  98. try_return(NOTHING);
  99. }
  100. //
  101. // Complete any the first become backup request outstanding against this
  102. // workstation.
  103. //
  104. Irp = BowserDequeueQueuedIrp(&Transport->BecomeBackupQueue);
  105. if (Irp != NULL) {
  106. Irp->IoStatus.Information = 0;
  107. BowserCompleteRequest(Irp, STATUS_SUCCESS);
  108. }
  109. }
  110. try_exit:NOTHING;
  111. } finally {
  112. UNLOCK_TRANSPORT(Transport);
  113. BowserDereferenceTransportName(Context->TransportName);
  114. BowserDereferenceTransport(Transport);
  115. if (UPromoteeName.Buffer != NULL) {
  116. RtlFreeUnicodeString(&UPromoteeName);
  117. }
  118. InterlockedDecrement( &BowserPostedDatagramCount );
  119. FREE_POOL(Context);
  120. }
  121. }
  122. VOID
  123. BowserResetStateForTransport(
  124. IN PTRANSPORT Transport,
  125. IN UCHAR NewState
  126. )
  127. {
  128. PIRP Irp = NULL;
  129. PIO_STACK_LOCATION IrpSp;
  130. NTSTATUS Status;
  131. //
  132. // Complete a reset state IRP outstanding on this transport.
  133. //
  134. Irp = BowserDequeueQueuedIrp(&Transport->ChangeRoleQueue);
  135. if (Irp != NULL) {
  136. PLMDR_REQUEST_PACKET RequestPacket = Irp->AssociatedIrp.SystemBuffer;
  137. IrpSp = IoGetCurrentIrpStackLocation(Irp);
  138. if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(LMDR_REQUEST_PACKET)) {
  139. Status = STATUS_INSUFFICIENT_RESOURCES;
  140. } else {
  141. RequestPacket->Parameters.ChangeRole.RoleModification = NewState;
  142. Irp->IoStatus.Information = sizeof(LMDR_REQUEST_PACKET);
  143. Status = STATUS_SUCCESS;
  144. }
  145. BowserCompleteRequest(Irp, Status);
  146. }
  147. }
  148. DATAGRAM_HANDLER(
  149. BowserResetState
  150. )
  151. {
  152. PTRANSPORT Transport = TransportName->Transport;
  153. UCHAR NewState = (UCHAR)((PRESET_STATE_1)(Buffer))->Options;
  154. BowserResetStateForTransport(Transport, NewState);
  155. return STATUS_SUCCESS;
  156. }