⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ptextend.c

📁 这个还是关于驱动与应用层通信的,主要是中间层的问题
💻 C
📖 第 1 页 / 共 2 页
字号:
      DBGPRINT(( "      Handle Already Associated(2)\n" ));
      PtDerefAdapter( pAdapt );

      NtStatus = STATUS_DEVICE_BUSY;
      goto CompleteTheIRP;
   }

   //
   // Associate This Handle With The Open Context
   //
   pIrpSp->FileObject->FsContext = pOpenContext;


   //
   // Complete The IRP
   //
CompleteTheIRP:

   pIrp->IoStatus.Information = BytesReturned;
   pIrp->IoStatus.Status = NtStatus;
   IoCompleteRequest(pIrp, IO_NO_INCREMENT);

   DBGPRINT(("<== Pt DevOpenAdapter\n"));
   
   return NtStatus;
}


VOID
DevRequestComplete(
   IN  PADAPT              pAdapt,
   IN  PNDIS_REQUEST_EX    pLocalRequest,
   IN  NDIS_STATUS         Status
   )
{
   POPEN_CONTEXT  pOpenContext;
   
   DBGPRINT(("<== Pt DevRequestComplete\n"));

   pOpenContext = (POPEN_CONTEXT )pLocalRequest->RequestContext;

   pLocalRequest->RequestStatus = Status;

   NdisSetEvent( &pLocalRequest->RequestEvent );

   DBGPRINT(("<== Pt DevRequestComplete\n"));
}


NTSTATUS
DevQueryInformation(
   IN PDEVICE_OBJECT    pDeviceObject,
   IN PIRP              pIrp,
   IN BOOLEAN           bUseVirtualName
   )
{
   PIO_STACK_LOCATION  pIrpSp;
   NTSTATUS            NtStatus = STATUS_SUCCESS;
   ULONG               BytesReturned = 0;
   PUCHAR              ioBuffer = NULL;
   ULONG               inputBufferLength;
   ULONG               outputBufferLength;
   NDIS_OID            Oid;
   PADAPT              pAdapt;
   POPEN_CONTEXT       pOpenContext;
   PNDIS_REQUEST_EX    pLocalRequest;
   NDIS_STATUS         NdisStatus;

   UNREFERENCED_PARAMETER(pDeviceObject);

   pIrpSp = IoGetCurrentIrpStackLocation(pIrp);

   DBGPRINT(("==>Pt DevQueryInformation: FileObject %p\n", pIrpSp->FileObject));

   ioBuffer = pIrp->AssociatedIrp.SystemBuffer;
   inputBufferLength  = pIrpSp->Parameters.DeviceIoControl.InputBufferLength;
   outputBufferLength = pIrpSp->Parameters.DeviceIoControl.OutputBufferLength;

   pOpenContext = pIrpSp->FileObject->FsContext;

   if( !pOpenContext )
   {
      DBGPRINT(( "      Invalid Handle\n" ));
      
      NtStatus = STATUS_INVALID_HANDLE;
      goto CompleteTheIRP;
   }


   DBGPRINT(( "      Found Open Context\n" ));

   pAdapt = pOpenContext->pAdapt;

   if( !pAdapt )
   {
      DBGPRINT(( "      Adapter Not Found\n" ));
      
      NtStatus = STATUS_INVALID_HANDLE;
      goto CompleteTheIRP;
   }

   //
   // Sanity Check On Input Buffer/OID
   //
   if( inputBufferLength != sizeof( NDIS_OID ) )
   {
      DBGPRINT(( "      Invalid OID Input Buffer Length\n" ));

      NtStatus = STATUS_INVALID_PARAMETER;
      goto CompleteTheIRP;
   }

   Oid = *(PNDIS_OID )ioBuffer;

   DBGPRINT(( "Query for Information on OID 0x%8.8X\n", Oid ));

   //
   // Fail Open If Unbind Is In Progress
   //
   NdisAcquireSpinLock(&pAdapt->Lock);

   if( pAdapt->UnbindingInProcess )
   {
      NdisReleaseSpinLock(&pAdapt->Lock);
      DBGPRINT(( "      Unbind In Process\n" ));

      NtStatus = STATUS_INVALID_DEVICE_STATE;
      goto CompleteTheIRP;
   }

   //
   // All other queries are failed, if the miniport is not at D0,
   //
   if (pAdapt->MPDeviceState > NdisDeviceStateD0)
   {
      NdisReleaseSpinLock(&pAdapt->Lock);
      DBGPRINT(( "      Invalid Miniport Device State\n" ));

      NtStatus = STATUS_INVALID_DEVICE_STATE;
      goto CompleteTheIRP;
   }

   //
   // This is in the process of powering down the system, always fail the request
   // 
   if (pAdapt->StandingBy == TRUE)
   {
      NdisReleaseSpinLock(&pAdapt->Lock);
      DBGPRINT(( "      Miniport Powering Down\n" ));

      NtStatus = STATUS_INVALID_DEVICE_STATE;
      goto CompleteTheIRP;
   }

   NdisReleaseSpinLock(&pAdapt->Lock);

   //
   // Now (Finally) Make The NDIS Request...
   //

   //
   // May need to add ref counts to adapt and open context. Also, bump
   // a counter of outstanding requests...
   //

   DevRefOpenContext( pOpenContext );

   pLocalRequest = &pOpenContext->LocalRequest;

   pLocalRequest->Request.RequestType = NdisRequestQueryInformation;
   pLocalRequest->Request.DATA.QUERY_INFORMATION.Oid = Oid;
   pLocalRequest->Request.DATA.QUERY_INFORMATION.InformationBuffer = ioBuffer;
   pLocalRequest->Request.DATA.QUERY_INFORMATION.InformationBufferLength = outputBufferLength;
   pLocalRequest->Request.DATA.QUERY_INFORMATION.BytesNeeded = 0;
   pLocalRequest->Request.DATA.QUERY_INFORMATION.BytesWritten = 0;

   pLocalRequest->RequestCompleteHandler = DevRequestComplete;
   pLocalRequest->RequestContext = pOpenContext;

   NdisResetEvent( &pLocalRequest->RequestEvent );

   NdisRequest(
      &NdisStatus,
      pAdapt->BindingHandle,
      (PNDIS_REQUEST )pLocalRequest
      );

   if( NdisStatus != NDIS_STATUS_PENDING )
   {
      DevRequestComplete( pAdapt, pLocalRequest, NdisStatus );
   }

   NdisWaitEvent( &pLocalRequest->RequestEvent, 0 );

   NdisStatus = pLocalRequest->RequestStatus;

   if( NdisStatus == NDIS_STATUS_SUCCESS )
   {
      BytesReturned = pLocalRequest->Request.DATA.QUERY_INFORMATION.BytesWritten;

      if( BytesReturned > outputBufferLength )
      {
         BytesReturned = outputBufferLength;
      }

      NtStatus = STATUS_SUCCESS;
   }
   else
   {
      NDIS_STATUS_TO_NT_STATUS( NdisStatus, &NtStatus);
   }

   DevDerefOpenContext( pOpenContext );

   //
   // Complete The IRP
   //
CompleteTheIRP:

   pIrp->IoStatus.Information = BytesReturned;
   pIrp->IoStatus.Status = NtStatus;
   IoCompleteRequest(pIrp, IO_NO_INCREMENT);

   DBGPRINT(("<== Pt DevQueryInformation\n"));
   
   return NtStatus;
}


NTSTATUS
DevOpen(
    IN PDEVICE_OBJECT    pDeviceObject,
    IN PIRP              pIrp
    )
/*++

Routine Description:

    This is the dispatch routine for handling IRP_MJ_CREATE.
    We simply succeed this.

Arguments:

    pDeviceObject - Pointer to the device object.

    pIrp - Pointer to the request packet.

Return Value:

    Status is returned.

--*/
{
    PIO_STACK_LOCATION  pIrpSp;
    NTSTATUS            NtStatus = STATUS_SUCCESS;
	
    UNREFERENCED_PARAMETER(pDeviceObject);
    
    pIrpSp = IoGetCurrentIrpStackLocation(pIrp);
	
    pIrpSp->FileObject->FsContext = NULL;
    pIrpSp->FileObject->FsContext2 = NULL;
	
    DBGPRINT(("==>Pt DevOpen: FileObject %p\n", pIrpSp->FileObject));
	
    pIrp->IoStatus.Information = 0;
    pIrp->IoStatus.Status = NtStatus;
	
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	
    DBGPRINT(("<== Pt DevOpen\n"));
	
    return NtStatus;
}


VOID
DevOnUnbindAdapter( POPEN_CONTEXT pOpenContext )
{
   PADAPT pAdapt = NULL;

   if( !pOpenContext )
   {
      return;
   }

   DBGPRINT(("==>Pt DevOnUnbindAdapter: Context %p\n", pOpenContext ));

   //
   // Set Flag That Will Cause Future I/O To Fail
   //
   pOpenContext->bAdapterClosed = TRUE;

   //
   // Wait For Pending NDIS Operations To Complete
   //

   //
   // Cancel Pending User-Mode I/O Operations
   //

   DBGPRINT(("<== Pt DevOnUnbindAdapter\n"));
}


NTSTATUS
DevCleanup(
    IN PDEVICE_OBJECT    pDeviceObject,
    IN PIRP              pIrp
    )
/*++

Routine Description:

    This is the dispatch routine for handling IRP_MJ_CLEANUP.
    Cancel and complete currently queued IRPs that are associated with
    the FileObject member of the driver's IO_STACK_LOCATION.

Arguments:

    pDeviceObject - Pointer to the device object.

    pIrp - Pointer to the request packet.

Return Value:

    Status is returned.

--*/
{
    PIO_STACK_LOCATION  pIrpSp;
    NTSTATUS            NtStatus = STATUS_SUCCESS;
    POPEN_CONTEXT       pOpenContext;
	
    UNREFERENCED_PARAMETER(pDeviceObject);
    
    pIrpSp = IoGetCurrentIrpStackLocation(pIrp);
    pOpenContext = pIrpSp->FileObject->FsContext;
	
    DBGPRINT(("==>Pt DevCleanup: Context %p\n", (pIrpSp->FileObject)->FsContext ));
	
    if( pOpenContext )
    {
    }

    pIrp->IoStatus.Information = 0;
    pIrp->IoStatus.Status = NtStatus;
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	
    DBGPRINT(("<== Pt DevCleanup\n"));
	
    return NtStatus;
} 


NTSTATUS
DevClose(
    IN PDEVICE_OBJECT    pDeviceObject,
    IN PIRP              pIrp
    )
/*++

Routine Description:

    This is the dispatch routine for handling IRP_MJ_CLOSE.
    Undo that which was done in IRP_MJ_CREATE.

Arguments:

    pDeviceObject - Pointer to the device object.

    pIrp - Pointer to the request packet.

Return Value:

    Status is returned.

--*/
{
    PIO_STACK_LOCATION  pIrpSp;
    NTSTATUS            NtStatus = STATUS_SUCCESS;
    POPEN_CONTEXT       pOpenContext;
	
    UNREFERENCED_PARAMETER(pDeviceObject);
    
    pIrpSp = IoGetCurrentIrpStackLocation(pIrp);
    pOpenContext = pIrpSp->FileObject->FsContext;
	
    DBGPRINT(("==>Pt DevClose: Context %p\n", (pIrpSp->FileObject)->FsContext ));

    //
    // Undo IRP_MJ_CREATE Operations
    //
    pIrpSp->FileObject->FsContext = NULL;
    pIrpSp->FileObject->FsContext2 = NULL;
	
    if( pOpenContext )
    {
      if( pOpenContext->pAdapt )
      {
         NdisAcquireSpinLock(&(pOpenContext->pAdapt)->Lock);
         (pOpenContext->pAdapt)->pOpenContext = NULL;
         NdisReleaseSpinLock(&(pOpenContext->pAdapt)->Lock);
      }

      DevDerefOpenContext( pOpenContext );
    }
	
    pIrp->IoStatus.Information = 0;
    pIrp->IoStatus.Status = NtStatus;
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	
    DBGPRINT(("<== Pt DevClose\n"));
	
    return NtStatus;
} 


NTSTATUS
DevIoControl(
    IN PDEVICE_OBJECT    pDeviceObject,
    IN PIRP              pIrp
    )
/*++

Routine Description:

    This is the dispatch routine for handling device ioctl requests.

Arguments:

    pDeviceObject - Pointer to the device object.

    pIrp - Pointer to the request packet.

Return Value:

    Status is returned.

--*/
{
    PIO_STACK_LOCATION  pIrpSp;
    NTSTATUS            NtStatus = STATUS_SUCCESS;
    ULONG               BytesReturned = 0;
    ULONG               FunctionCode;
    PUCHAR              ioBuffer = NULL;
    ULONG               inputBufferLength;
    ULONG               outputBufferLength;
    
    UNREFERENCED_PARAMETER(pDeviceObject);
    
    pIrpSp = IoGetCurrentIrpStackLocation(pIrp);
    
    ioBuffer = pIrp->AssociatedIrp.SystemBuffer;
    inputBufferLength  = pIrpSp->Parameters.DeviceIoControl.InputBufferLength;
    outputBufferLength = pIrpSp->Parameters.DeviceIoControl.OutputBufferLength;
    
    FunctionCode = pIrpSp->Parameters.DeviceIoControl.IoControlCode;
    
    DBGPRINT(("==>Pt DevIoControl: Context %p\n", (pIrpSp->FileObject)->FsContext ));
    
    switch (FunctionCode)
    {
        case IOCTL_PTUSERIO_ENUMERATE:
         return( DevEnumerateBindings(
                  pDeviceObject,
                  pIrp
                  )
               );

        case IOCTL_PTUSERIO_OPEN_ADAPTER:
         return( DevOpenAdapter(
                  pDeviceObject,
                  pIrp,
                  FALSE        // Is Lower Adapter
                  )
               );

        case IOCTL_PTUSERIO_QUERY_INFORMATION:
         return( DevQueryInformation(
                  pDeviceObject,
                  pIrp,
                  FALSE        // Is Lower Adapter
                  )
               );

        case IOCTL_PTUSERIO_SET_INFORMATION:
        default:
            NtStatus = STATUS_NOT_SUPPORTED;
            break;
    }
    
    if (NtStatus != STATUS_PENDING)
    {
        pIrp->IoStatus.Information = BytesReturned;
        pIrp->IoStatus.Status = NtStatus;
        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    }
    
    DBGPRINT(("<== Pt DevIoControl\n"));
    
    return NtStatus;
} 



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -