NTSTATUS tdi_disassociate_address(PFILE_OBJECT connectionFileObject) { PDEVICE_OBJECT devObj; KEVENT event; PIRP irp; IO_STATUS_BLOCK iosb; NTSTATUS status; devObj = IoGetRelatedDeviceObject(connectionFileObject); KeInitializeEvent(&event, NotificationEvent, FALSE); irp = TdiBuildInternalDeviceControlIrp(TDI_DISASSOCIATE_ADDRESS, devObj, connectionFileObject, &event, &iosb); if (irp == NULL) { return STATUS_INSUFFICIENT_RESOURCES; } TdiBuildDisassociateAddress(irp, devObj, connectionFileObject, NULL, NULL); status = IoCallDriver(devObj, irp); if (status == STATUS_PENDING) { KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); status = iosb.Status; } return status; }
NTSTATUS xTdiDisassociateAddressEx( __in PIRP Irp, __in PDEVICE_OBJECT ConnectionDeviceObject, __in PFILE_OBJECT ConnectionFileObject, __in PXTDI_OVERLAPPED Overlapped) { NTSTATUS status; ASSERT(NULL != Irp); ASSERT(NULL != ConnectionDeviceObject); ASSERT(NULL != ConnectionFileObject); ASSERT(NULL != Overlapped); TdiBuildDisassociateAddress( Irp, ConnectionDeviceObject, ConnectionFileObject, xTdiOverlappedIoCompletionRoutine, Overlapped); status = IoCallDriver(ConnectionDeviceObject, Irp); return status; }
NTSTATUS LpxTdiDisassociateAddress( IN PFILE_OBJECT ConnectionFileObject ) { PDEVICE_OBJECT deviceObject; PIRP irp; KEVENT event; IO_STATUS_BLOCK ioStatusBlock; NTSTATUS ntStatus; LtDebugPrint (3, ("[LpxTdi] LpxTdiDisassociateAddress: Entered\n")); // // Make Event. // KeInitializeEvent(&event, NotificationEvent, FALSE); deviceObject = IoGetRelatedDeviceObject(ConnectionFileObject); // // Make IRP. // irp = TdiBuildInternalDeviceControlIrp( TDI_DISASSOCIATE_ADDRESS, deviceObject, ConnectionFileObject, &event, &ioStatusBlock ); if(irp == NULL) { LtDebugPrint(1, ("[LpxTdi] TdiDisassociateAddress: Can't Build IRP.\n")); return STATUS_INSUFFICIENT_RESOURCES; } TdiBuildDisassociateAddress( irp, deviceObject, ConnectionFileObject, NULL, NULL ); irp->MdlAddress = NULL; ntStatus = LpxTdiIoCallDriver( deviceObject, irp, NULL, NULL, TRUE); #if DBG if(ntStatus != STATUS_SUCCESS) { LtDebugPrint(1, ("[LpxTdi] TdiDisassociateAddress: Failed. STATUS=%08lx\n", ntStatus)); } #endif return ntStatus; }
BOOLEAN KTdiStreamSocket::Unbind() { //KLocker locker(&m_KSynchroObject); BOOLEAN bRes = TRUE; PIRP pIrp = NULL, pIrpError = NULL; PDEVICE_OBJECT pDeviceObject; NTSTATUS NtStatus; IO_STATUS_BLOCK IoStatusBlock; __try { if (m_bOpen == TRUE && m_bBind == TRUE && m_bConnected == FALSE && m_bListen == FALSE) { bRes = FALSE; pDeviceObject = IoGetRelatedDeviceObject(m_pTdiConnectionObject); pIrp = TdiBuildInternalDeviceControlIrp( TDI_DISASSOCIATE_ADDRESS, pDeviceObject, m_pTdiConnectionObject, NULL, NULL); pIrpError = pIrp; if (pIrp != NULL) { TdiBuildDisassociateAddress( pIrp, pDeviceObject, m_pTdiConnectionObject, NULL, NULL); pIrpError = NULL; NtStatus = TdiCall(pIrp, pDeviceObject, &IoStatusBlock); if (NT_SUCCESS(NtStatus)) { m_bBind = FALSE; bRes = TRUE; } else { DbgPrint ("TdiUnbind: ERROR (%08x)!!!\n", NtStatus); } } } } __finally { if (pIrpError != NULL) IoFreeIrp(pIrpError); } return bRes; }
NTSTATUS TdiDisassociateAddressFile( PFILE_OBJECT ConnectionObject) /* * FUNCTION: Disassociates a connection endpoint from an address file object * ARGUMENTS: * ConnectionObject = Connection endpoint file object * RETURNS: * Status of operation */ { PDEVICE_OBJECT DeviceObject; IO_STATUS_BLOCK Iosb; KEVENT Event; PIRP Irp; AFD_DbgPrint(MAX_TRACE, ("Called. ConnectionObject (%p)\n", ConnectionObject)); if (!ConnectionObject) { AFD_DbgPrint(MIN_TRACE, ("Bad connection object.\n")); return STATUS_INVALID_PARAMETER; } DeviceObject = IoGetRelatedDeviceObject(ConnectionObject); if (!DeviceObject) { AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n")); return STATUS_INVALID_PARAMETER; } KeInitializeEvent(&Event, NotificationEvent, FALSE); Irp = TdiBuildInternalDeviceControlIrp(TDI_DISASSOCIATE_ADDRESS, /* Sub function */ DeviceObject, /* Device object */ ConnectionObject, /* File object */ &Event, /* Event */ &Iosb); /* Status */ if (!Irp) return STATUS_INSUFFICIENT_RESOURCES; TdiBuildDisassociateAddress(Irp, DeviceObject, ConnectionObject, NULL, NULL); return TdiCall(Irp, DeviceObject, &Event, &Iosb); }