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

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

?? rs485nt.c

?? RS485設(shè)備驅(qū)動源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
                ch = READ_PORT_UCHAR (DeviceExtension->ComPort.MSR);
                break;

            default:
                break;
        }
        ch = READ_PORT_UCHAR (DeviceExtension->ComPort.IIR);    // Read the IIR again for the next loop
    }

    //
    // Return TRUE to signify this was our interrupt and we serviced it.
    //

    return TRUE;
}


//---------------------------------------------------------------------------
// RS485_Dpc_Routine
//
// Description:
//  This DPC for ISR is issued by RS485_Isr to complete Transmit processing
//  by setting the XmitDone event.
//
// Arguments:
//      Dpc             - not used
//      DeviceObject    - Pointer to the Device object
//      Irp             - not used
//      Context         - not used
//
// Return Value:
//      none
//
VOID RS485_Dpc_Routine (IN PKDPC Dpc, IN PDEVICE_OBJECT DeviceObject, 
                        IN PIRP Irp, IN PVOID Context)
{
    PRS485NT_DEVICE_EXTENSION DeviceExtension;

    DeviceExtension = DeviceObject->DeviceExtension;

    //
    // Set the Xmit Done event
    //

    KeSetEvent (&DeviceExtension->XmitDone, 0, FALSE);

    RS_DbgPrint ("RS485NT: Dpc Routine KeSetEvent\n");
    return;
}


//---------------------------------------------------------------------------
// ReportUsage
//
// Description:
//  This routine registers (reports) the I/O and IRQ usage for this driver.
//
// Arguments:
//      DriverObject    - Pointer to the driver object
//      DeviceObject    - Pointer to the Device object
//      PortAddress     - Address of I/O port used
//      ConflictDetected - TRUE if a resource conflict was detected.
//
// Return Value:
//      TRUE    - If a Resource conflict was detected
//      FALSE   - If no conflict was detected
//
BOOLEAN ReportUsage(IN PDRIVER_OBJECT DriverObject,
                    IN PDEVICE_OBJECT DeviceObject,
                    IN PHYSICAL_ADDRESS PortAddress,
                    IN BOOLEAN *ConflictDetected)
{
    PRS485NT_DEVICE_EXTENSION extension;

    ULONG sizeOfResourceList;
    PCM_RESOURCE_LIST resourceList;
    PCM_FULL_RESOURCE_DESCRIPTOR nextFrd;
    PCM_PARTIAL_RESOURCE_DESCRIPTOR partial;

    extension = (PRS485NT_DEVICE_EXTENSION) DeviceObject->DeviceExtension;

    //
    // The size of the resource list is going to be one full descriptor
    // which already has one partial descriptor included, plus another
    // partial descriptor. One partial descriptor will be for the
    // interrupt, and the other for the port addresses.
    //

    sizeOfResourceList = sizeof(CM_FULL_RESOURCE_DESCRIPTOR);

    //
    // The full resource descriptor already contains one
    // partial.	Make room for one more.
    //
    // It will hold the irq "prd", and the port "prd".
    //	  ("prd" = partial resource descriptor)
    //

    sizeOfResourceList += sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);

    //
    // Now we increment the length of the resource list by field offset
    // of the first frd.   This will give us the length of what preceeds
    // the first frd in the resource list.
    //	 (frd = full resource descriptor)
    //

    sizeOfResourceList += FIELD_OFFSET(CM_RESOURCE_LIST, List[0]);

    resourceList = ExAllocatePool(PagedPool, sizeOfResourceList);

    if (!resourceList) {
        return FALSE;
    }

    //
    // Zero out the list
    //

    RtlZeroMemory(resourceList, sizeOfResourceList);

    resourceList->Count = 1;
    nextFrd = &resourceList->List[0];

    nextFrd->InterfaceType = Isa;
    nextFrd->BusNumber = 0;

    //
    // We are going to report port addresses and interrupt
    //

    nextFrd->PartialResourceList.Count = 2;

    //
    // Now fill in the port data.  We don't wish to share
    // this port range with anyone.
    //
    // Note: the port address we pass in is the one we got
    // back from HalTranslateBusAddress.
    //

    partial = &nextFrd->PartialResourceList.PartialDescriptors[0];

    partial->Type = CmResourceTypePort;
    partial->ShareDisposition = CmResourceShareDriverExclusive;
    partial->Flags = CM_RESOURCE_PORT_IO;
    partial->u.Port.Start = PortAddress;
    partial->u.Port.Length = DEF_PORT_RANGE;

    partial++;

    //
    // Now fill in the irq stuff.
    //
    // Note: for IoReportResourceUsage, the Interrupt.Level and
    // Interrupt.Vector are bus-specific level and vector, just
    // as we passed in to HalGetInterruptVector, not the mapped
    // system vector we got back from HalGetInterruptVector.
    //

    partial->Type = CmResourceTypeInterrupt;
    partial->u.Interrupt.Level = extension->IRQLine;
    partial->u.Interrupt.Vector = extension->IRQLine;
    partial->ShareDisposition = CmResourceShareDriverExclusive;
    partial->Flags = CM_RESOURCE_INTERRUPT_LATCHED;

    IoReportResourceUsage(
        NULL,
        DriverObject,
        resourceList,
        sizeOfResourceList,
        NULL,
        NULL,
        0,
        FALSE,
	    ConflictDetected);

    //
    // The above routine sets the BOOLEAN parameter ConflictDetected
    // to TRUE if a conflict was detected.
    //

    ExFreePool(resourceList);

    return (*ConflictDetected);
}


//---------------------------------------------------------------------------
//
//
// Routine Description:
// 
//     Process the IRPs sent to this device.
// 
// Arguments:
// 
//     DeviceObject - pointer to a device object
// 
//     Irp          - pointer to an I/O Request Packet
// 
// Return Value:
// 
// 
NTSTATUS DispatchRoutine (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    PIO_STACK_LOCATION  irpStack;
    PRS485NT_DEVICE_EXTENSION   deviceExtension;
    PVOID               ioBuffer;
    ULONG               inputBufferLength;
    ULONG               outputBufferLength;
    ULONG               ioControlCode;
    NTSTATUS            ntStatus;

    LARGE_INTEGER       CurrentSystemTime;
    LARGE_INTEGER       ElapsedTime;
    
    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);

    //
    // Get a pointer to the device extension
    //

    deviceExtension = DeviceObject->DeviceExtension;

    //
    // Get the pointer to the input/output buffer and it's length
    //

    ioBuffer           = Irp->AssociatedIrp.SystemBuffer;
    inputBufferLength  = irpStack->Parameters.DeviceIoControl.InputBufferLength;
    outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;

    switch (irpStack->MajorFunction) {
        case IRP_MJ_CREATE:
        {    
            RS_DbgPrint ("RS485NT: IRP_MJ_CREATE\n");
            break;
        }

        case IRP_MJ_CLOSE:
        {
            RS_DbgPrint ("RS485NT: IRP_MJ_CLOSE\n");
            break;
        }

        case IRP_MJ_READ:
        {
            RS_DbgPrint ("RS485NT: IRP_MJ_READ\n");
            RS485_Read (deviceExtension, Irp);
            break;
        }

        case IRP_MJ_WRITE:
        {
            RS_DbgPrint ("RS485NT: IRP_MJ_WRITE\n");
            RS485_Write (deviceExtension, Irp);
            break;
        }

        case IRP_MJ_DEVICE_CONTROL:
        {
            RS_DbgPrint ("RS485NT: IRP_MJ_DEVICE_CONTROL - ");
    
            ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
    
            switch (ioControlCode)
            {
                case IOCTL_RS485NT_HELLO:
                {
                    RS_DbgPrint ("HELLO\n");
                            
                    //
                    // Some app is saying hello
                    //

                    break;
                }

                case IOCTL_RS485NT_GET_RCV_COUNT:
                {
                    RS_DbgPrint ("GET_RCV_COUNT\n");
                    if (outputBufferLength >= 4) {
                        //
                        // Return the current receive buffer count
                        //

                        *(ULONG *)ioBuffer = deviceExtension->RcvBufferCount;

                        Irp->IoStatus.Information = 4;
                    }
                    break;
                }

                case IOCTL_RS485NT_LAST_RCVD_TIME:
                {
                    RS_DbgPrint ("LAST_RCVD_TIME\n");
                    if (outputBufferLength >= 8) {

                        //
                        // Get the current system time and convert to Milliseconds
                        //

                        KeQuerySystemTime (&CurrentSystemTime);
                        ElapsedTime.QuadPart = CurrentSystemTime.QuadPart - 
                                               deviceExtension->LastQuerySystemTime.QuadPart;
                        ElapsedTime.QuadPart /= 10000;

                        RtlMoveMemory (ioBuffer, &ElapsedTime, 8);
                        Irp->IoStatus.Information = 8;
                    }

                    break;
                }

                default:
                {
                    RS_DbgPrint ("RS485NT: Unknown IRP_MJ_DEVICE_CONTROL\n");
                    Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
                    break;
                }
    
            }
    
            break;
        }
        default:
        {
            RS_DbgPrint ("RS485NT: Unhandled IRP_MJ function\n");
            Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
            break;
        }
    }

    //
    // DON'T get cute and try to use the status field of
    // the irp in the return status.  That IRP IS GONE as
    // soon as you call IoCompleteRequest.
    //

    ntStatus = Irp->IoStatus.Status;

    IoCompleteRequest (Irp, IO_NO_INCREMENT);

    RS_DbgPrint ("RS485NT: DisptachRoutine exit.\n");

    //
    // We never have pending operation so always return the status code.
    //

    return ntStatus;
}


//---------------------------------------------------------------------------
// UnloadDriver
//
// Description:
//     Free all the allocated resources, etc.
//
// Arguments:
//     DriverObject - pointer to a driver object
// 
// Return Value:
//      None
// 
VOID UnloadDriver (IN PDRIVER_OBJECT DriverObject)
{
    WCHAR                  deviceLinkBuffer[]  = L"\\DosDevices\\RS485NT";
    UNICODE_STRING         deviceLinkUnicodeString;
    PRS485NT_DEVICE_EXTENSION extension;

    extension = DriverObject->DeviceObject->DeviceExtension;

    //
    // Deactivate all of the MCR interrupt sources.
    //

    WRITE_PORT_UCHAR (extension->ComPort.MCR, MCR_DEACTIVATE_ALL);

    //
    // Free any resources
    //

    IoDisconnectInterrupt (extension->InterruptObject);

    //
    // Delete the symbolic link
    //

    RtlInitUnicodeString (&deviceLinkUnicodeString, deviceLinkBuffer);

    IoDeleteSymbolicLink (&deviceLinkUnicodeString);

    //
    // Delete the device object
    //

    IoDeleteDevice (DriverObject->DeviceObject);

    RS_DbgPrint ("RS485NT: Unloaded\n");
    return;
}


//---------------------------------------------------------------------------
//  GetConfiguration
//
// Description:
//      Obtains driver configuration information from the Registry.
//
// Arguments:
//      DeviceExtension - Pointer to the device extension.
//      RegistryPath    - Pointer to the null-terminated Unicode name of the
//                        registry path for this driver.
//
// Return Value:
//      NTSTATUS
// 
NTSTATUS GetConfiguration(IN PRS485NT_DEVICE_EXTENSION DeviceExtension,
                          IN PUNICODE_STRING RegistryPath)
{
    PRTL_QUERY_REGISTRY_TABLE parameters = NULL;
    UNICODE_STRING parametersPath;

    ULONG notThereDefault = 1234567;
    ULONG PortAddressDefault;
    ULONG IRQLineDefault;
    ULONG BaudRateDefault;
    ULONG BufferSizeDefault;

    NTSTATUS status = STATUS_SUCCESS;
    PWSTR path = NULL;
    USHORT queriesPlusOne = 5;

    parametersPath.Buffer = NULL;

    //
    // Registry path is already null-terminated, so just use it.
    //

    path = RegistryPath->Buffer;

    //
    // Allocate the Rtl query table.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品在线一区二区三区| 视频在线观看91| 成人av在线电影| 国产精品乱码一区二三区小蝌蚪| 国产一区视频在线看| 26uuu欧美日本| 成人午夜短视频| 日韩美女视频一区二区| 91国在线观看| 全国精品久久少妇| 欧美精品一区二区三区蜜桃 | 一区二区在线观看免费视频播放| 在线免费观看视频一区| 亚洲成av人**亚洲成av**| 日韩一级二级三级| 丁香桃色午夜亚洲一区二区三区| 亚洲天堂a在线| 欧美一二三区精品| 国产一区二区免费视频| 中文字幕一区二区三区不卡| 欧美性感一类影片在线播放| 久久精品国产一区二区| 国产午夜精品一区二区| 色八戒一区二区三区| 久久99精品视频| 一区二区三区国产豹纹内裤在线 | 日韩欧美一卡二卡| 国产mv日韩mv欧美| 性久久久久久久久| 欧美韩国一区二区| 日韩一卡二卡三卡四卡| heyzo一本久久综合| 蜜臀va亚洲va欧美va天堂| 中文字幕在线不卡一区| 欧美一区二区三区精品| 99精品在线观看视频| 老司机精品视频在线| 中文字幕中文乱码欧美一区二区| 91精品国产综合久久小美女| 成年人国产精品| 开心九九激情九九欧美日韩精美视频电影 | 日韩精品中午字幕| 91在线精品秘密一区二区| 理论电影国产精品| 亚洲一区二区欧美| 国产精品福利一区二区| 日韩一卡二卡三卡四卡| 在线免费不卡视频| av资源站一区| 高清不卡在线观看| 激情亚洲综合在线| 首页国产丝袜综合| 一区二区三区国产| 中文字幕一区二区三区视频| 久久免费精品国产久精品久久久久| 欧美亚洲综合一区| 色国产精品一区在线观看| voyeur盗摄精品| 成人性生交大片免费看在线播放| 美腿丝袜亚洲色图| 蜜臀av性久久久久av蜜臀妖精| 有码一区二区三区| 亚洲欧洲一区二区在线播放| 国产调教视频一区| 国产亚洲午夜高清国产拍精品| 欧美一区二区三区影视| 欧美日韩一区成人| 欧美精品精品一区| 欧美日韩国产小视频| 色狠狠一区二区三区香蕉| 91蜜桃在线免费视频| 99天天综合性| 一本色道久久综合亚洲aⅴ蜜桃| 不卡的av电影| 色综合中文字幕国产| 国产成人精品影院| 风间由美中文字幕在线看视频国产欧美| 黄色成人免费在线| 国产成人免费在线观看不卡| 国产乱国产乱300精品| 国产美女在线精品| 成人黄色电影在线 | 欧美人伦禁忌dvd放荡欲情| 91国模大尺度私拍在线视频| 91蝌蚪porny| 国产99精品在线观看| 日韩**一区毛片| 久久疯狂做爰流白浆xx| 毛片不卡一区二区| 国产精品系列在线观看| 国产mv日韩mv欧美| 99re6这里只有精品视频在线观看| 99久久99久久综合| 欧美性猛交xxxxxx富婆| 91精品国产91综合久久蜜臀| 日韩女优av电影| 国产欧美一区视频| 亚洲免费观看高清完整版在线观看 | 国产成人丝袜美腿| 色综合 综合色| 欧美一级艳片视频免费观看| www国产精品av| 成人免费视频在线观看| 亚洲一级在线观看| 国产精品一区不卡| 91麻豆产精品久久久久久| 欧美日韩的一区二区| 久久亚洲二区三区| 一区二区在线看| 久久99这里只有精品| 99久久精品免费看| 在线不卡中文字幕| 欧美激情一区二区三区蜜桃视频 | 91麻豆精品国产91久久久资源速度| 日韩网站在线看片你懂的| 久久久久久久网| 亚洲图片欧美视频| 国产成人亚洲精品狼色在线| 在线观看日韩av先锋影音电影院| 日韩免费高清视频| 亚洲精品乱码久久久久久日本蜜臀| 欧美a级理论片| 91小视频免费观看| 久久久久综合网| 亚洲二区视频在线| av电影在线观看完整版一区二区| 69久久夜色精品国产69蝌蚪网| 国产区在线观看成人精品| 日日夜夜一区二区| 91丨九色丨尤物| 久久亚洲综合色| 日本亚洲视频在线| 色一区在线观看| 国产精品久久国产精麻豆99网站| 日韩一区欧美二区| 91福利国产精品| 中文一区二区在线观看| 奇米色一区二区| 欧美日韩国产综合草草| 亚洲人成影院在线观看| 国产精一品亚洲二区在线视频| 777xxx欧美| 亚洲一区二区三区免费视频| 成人一区二区三区| 精品99久久久久久| 青娱乐精品在线视频| 欧美性猛交xxxx黑人交| 亚洲视频精选在线| 成人免费高清在线| 久久久久九九视频| 国产一区二区三区av电影 | 青青草一区二区三区| 欧美综合一区二区| 亚洲人xxxx| 97se狠狠狠综合亚洲狠狠| 国产欧美一二三区| 顶级嫩模精品视频在线看| 欧美精品一区二区高清在线观看| 肉色丝袜一区二区| 欧美一区二区视频在线观看| 首页国产欧美久久| 欧美一区二区精品久久911| 亚洲成人自拍网| 欧美三级午夜理伦三级中视频| 一区二区三区中文字幕精品精品| 99精品久久久久久| 亚洲免费资源在线播放| 色婷婷av一区| 亚洲观看高清完整版在线观看| 在线观看91视频| 亚洲第一成年网| 日韩午夜精品视频| 国产曰批免费观看久久久| 久久新电视剧免费观看| 国产 欧美在线| 最新日韩av在线| 欧洲精品一区二区三区在线观看| 亚洲综合丁香婷婷六月香| 欧美这里有精品| 日韩国产欧美在线视频| 日韩欧美在线网站| 国产一区二区在线影院| 亚洲国产精品ⅴa在线观看| 不卡视频免费播放| 亚洲一区二区三区三| 日韩欧美亚洲国产精品字幕久久久 | 偷拍一区二区三区| 日韩一区国产二区欧美三区| 国产一区二区三区四| 中文字幕乱码日本亚洲一区二区| 91丨九色丨黑人外教| 亚洲国产成人va在线观看天堂| 91精品在线麻豆| 国产激情视频一区二区在线观看 | 欧美精选一区二区| 国产精品一区二区在线看| 亚洲欧洲制服丝袜| 欧美疯狂做受xxxx富婆| 国产一区欧美日韩| 一区二区三区在线免费播放|