亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ezusbsys.c

?? EZ Usb system driver written in C.. a useful USB driver..
?? C
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
NTSTATUS
Ezusb_DefaultPnpHandler(
   IN PDEVICE_OBJECT fdo,
   IN PIRP Irp
   )
{
   PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

   IoSkipCurrentIrpStackLocation(Irp);
   return IoCallDriver(pdx->StackDeviceObject, Irp);
}

///////////////////////////////////////////////////////////////////////////////
// @func Handle completion of a request by a lower-level driver
// @parm Functional device object
// @parm I/O request which has completed
// @parm Context argument supplied to IoSetCompletionRoutine, namely address of
// KEVENT object on which ForwardAndWait is waiting
// @comm This is the completion routine used for requests forwarded by ForwardAndWait. It
// sets the event object and thereby awakens ForwardAndWait.
// @comm Note that it's *not* necessary for this particular completion routine to test
// the PendingReturned flag in the IRP and then call IoMarkIrpPending. You do that in many
// completion routines because the dispatch routine can't know soon enough that the
// lower layer has returned STATUS_PENDING. In our case, we're never going to pass a
// STATUS_PENDING back up the driver chain, so we don't need to worry about this.

NTSTATUS 
OnRequestComplete(
   IN PDEVICE_OBJECT fdo,
   IN PIRP Irp,
   IN PKEVENT pev
   )
/*++

Routine Description:
   Handle completion of a request by a lower-level driver

Arguments:
   DriverObject -  Functional device object
   Irp - I/O request which has completed
   pev - Context argument supplied to IoSetCompletionRoutine, namely address of
         KEVENT object on which ForwardAndWait is waiting

Return Value:
   STATUS_MORE_PROCESSING_REQUIRED
--*/
{
   KeSetEvent(pev, 0, FALSE);
   return STATUS_MORE_PROCESSING_REQUIRED;
}

NTSTATUS
ForwardAndWait(
   IN PDEVICE_OBJECT fdo,
   IN PIRP Irp
   )
/*++
Routine Description:
   Forward request to lower level and await completion

   The only purpose of this routine in this particular driver is to pass down
   IRP_MN_START_DEVICE requests and wait for the PDO to handle them.
   
   The processor must be at PASSIVE IRQL because this function initializes
   and waits for non-zero time on a kernel event object.

Arguments:
   fdo - pointer to a device object
   Irp          - pointer to an I/O Request Packet

Return Value:
   STATUS_SUCCESS if successful,
   STATUS_UNSUCCESSFUL otherwise
--*/
{
	KEVENT event;
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	NTSTATUS ntStatus;

   ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
	
	//
   // Initialize a kernel event object to use in waiting for the lower-level
	// driver to finish processing the object. 
   //
	KeInitializeEvent(&event, NotificationEvent, FALSE);

	IoCopyCurrentIrpStackLocationToNext(Irp);
	IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE) OnRequestComplete,
		(PVOID) &event, TRUE, TRUE, TRUE);

	ntStatus = IoCallDriver(pdx->StackDeviceObject, Irp);

	if (ntStatus == STATUS_PENDING)
	{
      KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
      ntStatus = Irp->IoStatus.Status;
   }

	return ntStatus;
}

NTSTATUS
CompleteRequest(
   IN PIRP Irp,
   IN NTSTATUS status,
   IN ULONG_PTR info
   )
/*++
Routine Description:
   Mark I/O request complete

Arguments:
   Irp - I/O request in question
   status - Standard status code
   info Additional information related to status code

Return Value:
   STATUS_SUCCESS if successful,
   STATUS_UNSUCCESSFUL otherwise
--*/
{
	Irp->IoStatus.Status = status;
	Irp->IoStatus.Information = info;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);

   return status;
}

NTSTATUS
Ezusb_DispatchPnp(
   IN PDEVICE_OBJECT fdo,
   IN PIRP           Irp
   )
/*++
Routine Description:
   Process Plug and Play IRPs sent to this device.

Arguments:
   fdo - pointer to a device object
   Irp          - pointer to an I/O Request Packet

Return Value:
   NTSTATUS
--*/
{
   PIO_STACK_LOCATION irpStack;
   PDEVICE_EXTENSION pdx = fdo->DeviceExtension;
   ULONG fcn;
   NTSTATUS ntStatus;

   Ezusb_KdPrint (("Enter Ezusb_DispatchPnp\n"));

   if (!LockDevice(fdo))
		return CompleteRequest(Irp, STATUS_DELETE_PENDING, 0);

   //
   // Get a pointer to the current location in the Irp. This is where
   //     the function codes and parameters are located.
   //
   irpStack = IoGetCurrentIrpStackLocation (Irp);

   ASSERT(irpStack->MajorFunction == IRP_MJ_PNP);

   fcn = irpStack->MinorFunction;

   switch (fcn)
   {
      case IRP_MN_START_DEVICE:

         Ezusb_KdPrint (("IRP_MN_START_DEVICE\n"));

         ntStatus = Ezusb_HandleStartDevice(fdo,Irp);

         if (ntStatus == STATUS_SUCCESS)
         {
            pdx->Started = TRUE;
         }

         break; //IRP_MN_START_DEVICE

      case IRP_MN_STOP_DEVICE:

         Ezusb_KdPrint (("IRP_MN_STOP_DEVICE\n"));

         //
         // first pass the request down the stack
         //
         Ezusb_DefaultPnpHandler(fdo,Irp);

         ntStatus = Ezusb_StopDevice(fdo);

         break; //IRP_MN_STOP_DEVICE

      case IRP_MN_REMOVE_DEVICE:

         Ezusb_KdPrint (("IRP_MN_REMOVE_DEVICE\n"))

         ntStatus = Ezusb_HandleRemoveDevice(fdo,Irp);

         break; //IRP_MN_REMOVE_DEVICE

      case IRP_MN_QUERY_CAPABILITIES:
      {
         //
         // This code swiped from Walter Oney.  Please buy his book!!
         //

      	PDEVICE_CAPABILITIES pdc = irpStack->Parameters.DeviceCapabilities.Capabilities;

         Ezusb_KdPrint (("IRP_MN_QUERY_CAPABILITIES\n"))

         // Check to be sure we know how to handle this version of the capabilities structure

	      if (pdc->Version < 1)
         {
		      ntStatus = Ezusb_DefaultPnpHandler(fdo, Irp);
            break;
         }

         ntStatus = ForwardAndWait(fdo, Irp);
	      if (NT_SUCCESS(ntStatus))
   		{						// IRP succeeded
      		pdc = irpStack->Parameters.DeviceCapabilities.Capabilities;
            // setting this field prevents NT5 from notifying the user when the
            // device is removed.
		      pdc->SurpriseRemovalOK = TRUE;
   		}						// IRP succeeded

	      ntStatus = CompleteRequest(Irp, ntStatus, Irp->IoStatus.Information);
      }
         break; //IRP_MN_QUERY_CAPABILITIES


      //
      // All other PNP IRP's are just passed down the stack by the default handler
      //
      default:
        Ezusb_KdPrint (("Passing down unhandled PnP IOCTL 0x%x\n", fcn));
        ntStatus = Ezusb_DefaultPnpHandler(fdo, Irp);

   } // switch MinorFunction

	if (fcn != IRP_MN_REMOVE_DEVICE)
      UnlockDevice(fdo);

   Ezusb_KdPrint (("Exit Ezusb_DispatchPnp %x\n", ntStatus));
   return ntStatus;

}//Ezusb_Dispatch


NTSTATUS
Ezusb_DispatchPower(
    IN PDEVICE_OBJECT fdo,
    IN PIRP           Irp
    )
/*++
Routine Description:
   Process the IRPs sent to this device.

Arguments:
   fdo - pointer to a device object
   Irp          - pointer to an I/O Request Packet

Return Value:
   NTSTATUS
--*/
{
   PIO_STACK_LOCATION irpStack, nextStack;
   PDEVICE_EXTENSION pdx = fdo->DeviceExtension;
   NTSTATUS ntStatus;

   Ezusb_KdPrint (("Enter Ezusb_DispatchPower\n"));

   Irp->IoStatus.Status = STATUS_SUCCESS;
   Irp->IoStatus.Information = 0;

   //
   // Get a pointer to the current location in the Irp. This is where
   //     the function codes and parameters are located.
   //
   irpStack = IoGetCurrentIrpStackLocation (Irp);



   Ezusb_KdPrint (("IRP_MJ_POWER MIN=0x%x Type=0x%x State=0x%x\n",irpStack->MinorFunction,
      irpStack->Parameters.Power.Type,
      irpStack->Parameters.Power.State.DeviceState));

   switch (irpStack->MinorFunction)
   {
      case IRP_MN_SET_POWER:

         switch (irpStack->Parameters.Power.Type)
         {
            case SystemPowerState:

               break; //SystemPowerState

            case DevicePowerState:
               switch (irpStack->Parameters.Power.State.DeviceState)
               {
                  case PowerDeviceD3:
                     Ezusb_KdPrint (("IRP_MN_SET_D3\n"));
                     break;
                  case PowerDeviceD2:
                     Ezusb_KdPrint (("IRP_MN_SET_D2\n"));
                    break;
                  case PowerDeviceD1:
                     Ezusb_KdPrint (("IRP_MN_SET_D1\n"));
                     break;
                  case PowerDeviceD0:
                     Ezusb_KdPrint (("IRP_MN_SET_D0\n"));
                     break;
                } // switch on Power.State.DeviceState

                break; //DevicePowerState

         }// switch on Power.Type

         break;  //IRP_MN_SET_POWER

      case IRP_MN_QUERY_POWER:

         // Look at what type of power query this is
         switch (irpStack->Parameters.Power.Type)
         {
            case SystemPowerState:

               break; //SystemPowerState

            case DevicePowerState:
               switch (irpStack->Parameters.Power.State.DeviceState)
               {
                  case PowerDeviceD2:
                     Ezusb_KdPrint (("IRP_MN_QUERY_D2\n"));
                     break;
                  case PowerDeviceD1:
                     Ezusb_KdPrint (("IRP_MN_QUERY_D1\n"));
                     break;
                  case PowerDeviceD3:
                     Ezusb_KdPrint (("IRP_MN_QUERY_D3\n"));
                     break;
               } //switch on Power.State.DeviceState

               break; //DevicePowerState
                            
         }//switch on Power.Type

         break; //IRP_MN_QUERY_POWER

      default:
         // A PnP Minor Function was not handled
         Ezusb_KdPrint (("Power IOCTL not handled\n"));

   } /* switch MinorFunction*/


   nextStack = IoGetNextIrpStackLocation(Irp);
   ASSERT(nextStack != NULL);
   RtlCopyMemory(nextStack, irpStack, sizeof(IO_STACK_LOCATION));

   //
   // All PNP_POWER messages get passed to the StackDeviceObject that
   // we were given in PnPAddDevice.
   //
   // This stack device object is managed by the USB software subsystem,
   // and so this IRP must be propagated to the owning device driver for
   // that stack device object, so that driver in turn can perform any
   // device state management (e.g., remove its device object, etc.).
   //
   Ezusb_KdPrint (("Passing Power Irp down\n"));

   //
   // Notes on passing power IRPs down:  Using IoCallDriver() to pass
   // down power IRPs worked until Windows 2000.  Using this method
   // with Win2K causes a blue screen at system shutdown.  Because of this,
   // I am modifying the driver to use the more correct PoXXX() functions
   // to handle power IRPs. Unfortunately, the PoXXX() calls weren't
   // added until the kernel until after the release of Windows 95 OSR2.
   // So, a driver using these calls will not load on a Windows 95 system.
   // If you need to use this driver under Windows 95. then you must
   // #define WIN95.
   //

#ifdef WIN95
   ntStatus = IoCallDriver(pdx->StackDeviceObject, Irp);
#else
   PoStartNextPowerIrp(Irp);
   ntStatus = PoCallDriver(pdx->StackDeviceObject,Irp);
#endif

   //
   // If lower layer driver marked the Irp as pending then reflect that by
   // calling IoMarkIrpPending.
   //
   if (ntStatus == STATUS_PENDING)
   {
      IoMarkIrpPending(Irp);
      Ezusb_KdPrint (("Power Irp came back with STATUS_PENDING (%x)\n", ntStatus));
   }
   else

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品久久一线不卡| 欧美一级久久久久久久大片| 有坂深雪av一区二区精品| 欧美人xxxx| 9l国产精品久久久久麻豆| 亚洲福利一区二区| 久久精品一区蜜桃臀影院| 欧美三级日韩三级国产三级| 激情亚洲综合在线| 国产一二三精品| 日韩vs国产vs欧美| 亚洲成av人片在线观看无码| 亚洲人妖av一区二区| 亚洲激情图片一区| 亚洲美女屁股眼交| 亚洲精品久久嫩草网站秘色| 国产精品二三区| 亚洲欧美一区二区在线观看| 亚洲六月丁香色婷婷综合久久| 中文字幕制服丝袜一区二区三区| 中文字幕乱码日本亚洲一区二区| 久久色在线视频| 国产亚洲婷婷免费| 欧美乱妇一区二区三区不卡视频| 日韩欧美亚洲国产精品字幕久久久| 久久久精品免费网站| 狠狠色综合播放一区二区| 在线欧美日韩国产| 国产精品沙发午睡系列990531| 中文字幕av一区 二区| 亚洲午夜久久久久中文字幕久| 日韩二区三区在线观看| 国模大尺度一区二区三区| av动漫一区二区| 欧美一区二区三区播放老司机 | 日韩欧美国产成人一区二区| 欧美日韩国产成人在线91| 麻豆精品国产传媒mv男同| 国产精品一区二区三区四区| 欧美性大战久久| 中文字幕不卡的av| 丝袜美腿亚洲一区| 国产成人av一区| 欧美日韩高清在线| 综合电影一区二区三区 | 中文字幕一区在线观看视频| 日本成人在线看| 欧美在线看片a免费观看| 久久久久久久免费视频了| 亚洲成人精品在线观看| 一本大道久久a久久综合婷婷| 欧美精品一区二区三区四区| 视频一区视频二区中文字幕| 91尤物视频在线观看| 国产欧美精品一区二区色综合 | 丝袜美腿高跟呻吟高潮一区| 成人app网站| 中文字幕在线一区二区三区| 成人午夜av电影| 国产精品沙发午睡系列990531| 国产v日产∨综合v精品视频| 久久人人97超碰com| 免播放器亚洲一区| 欧美不卡一区二区| 国内偷窥港台综合视频在线播放| 日韩欧美在线网站| 韩国一区二区在线观看| 久久九九全国免费| 成人av片在线观看| 一区二区在线电影| 欧美在线免费播放| 日本在线不卡视频| 中文字幕免费一区| 色婷婷久久久综合中文字幕| 亚洲国产欧美在线人成| 欧美一区二区免费观在线| 国产乱国产乱300精品| 国产精品剧情在线亚洲| 91国偷自产一区二区三区成为亚洲经典 | 精品一区二区三区在线播放视频| 久久影院午夜论| 欧美人妇做爰xxxⅹ性高电影| 久久爱www久久做| 色中色一区二区| 欧美激情综合五月色丁香小说| 欧美视频完全免费看| 91污片在线观看| www.99精品| 奇米精品一区二区三区在线观看 | 91成人网在线| 精品一区二区三区免费播放| 久久精品视频一区二区三区| 色屁屁一区二区| 久久99国内精品| 亚洲综合色噜噜狠狠| 亚洲欧洲成人自拍| 欧美一卡在线观看| 99久久伊人久久99| 国产精品系列在线观看| 亚洲影视在线播放| 亚洲三级在线免费观看| 久久亚洲精品小早川怜子| 欧美日韩一级二级| 972aa.com艺术欧美| 麻豆国产一区二区| 麻豆成人综合网| 性感美女极品91精品| 亚洲色欲色欲www| 中文字幕乱码亚洲精品一区| www国产亚洲精品久久麻豆| 欧美亚洲一区二区在线观看| 日本韩国欧美一区二区三区| 91伊人久久大香线蕉| 91蝌蚪国产九色| 国产欧美一二三区| 欧美激情在线观看视频免费| 国产精品成人免费精品自在线观看 | 一二三四社区欧美黄| 亚洲天堂中文字幕| 亚洲女人的天堂| 亚洲人成在线播放网站岛国| 亚洲人吸女人奶水| 亚洲一区二区四区蜜桃| 日日夜夜精品免费视频| 麻豆精品一区二区av白丝在线| 麻豆视频一区二区| 国产成人免费9x9x人网站视频| 成人午夜激情在线| 国产亚洲综合色| 99re在线视频这里只有精品| 成人动漫在线一区| 欧美天天综合网| 欧美成人vps| 1024成人网色www| 亚洲精品第一国产综合野| 天天射综合影视| 免费成人你懂的| 国产精品一线二线三线| 国产福利91精品一区二区三区| 91尤物视频在线观看| 欧美日韩精品免费观看视频| 日韩一区二区在线观看| 亚洲美女视频一区| 久久黄色级2电影| 不卡欧美aaaaa| 91精品视频网| 亚洲免费av观看| 国产成人亚洲综合a∨婷婷| 欧美日韩在线观看一区二区 | 国产a视频精品免费观看| 欧美日本一区二区三区四区| 日本一区二区高清| 天堂va蜜桃一区二区三区| 99re视频这里只有精品| 久久久五月婷婷| 欧美性高清videossexo| 国产精品网站在线| 激情深爱一区二区| 日韩一区二区精品葵司在线| 亚洲一区在线看| 色呦呦国产精品| 亚洲日本在线a| 白白色 亚洲乱淫| 国产亚洲一区字幕| 国产麻豆精品在线| 久久久久国产精品厨房| 高清国产一区二区| 国产精品乱人伦| www.亚洲激情.com| 日韩美女啊v在线免费观看| 一本大道av伊人久久综合| 一区二区三区在线看| 欧美日韩在线播放三区四区| 亚洲午夜精品网| 在线观看91精品国产麻豆| 美女一区二区三区在线观看| 日韩三级av在线播放| 精品一区二区三区在线观看| 精品国精品国产| 成人av网在线| 午夜精品久久久久久久久久久| 91精品一区二区三区久久久久久 | 色婷婷国产精品久久包臀| 亚洲成a人片综合在线| 欧美老年两性高潮| 精品无人码麻豆乱码1区2区| 久久综合九色综合久久久精品综合| 国内精品视频666| 综合电影一区二区三区| 欧美三电影在线| 国产酒店精品激情| 一二三四社区欧美黄| 日韩欧美高清在线| 成人av电影在线播放| 美女视频黄免费的久久 | 国产精品伦理在线| 欧美高清激情brazzers| 捆绑调教一区二区三区| 国产精品美女久久久久aⅴ| 在线观看一区二区视频|