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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rs485nt.c

?? RS485設備驅動源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
    //

    parameters = ExAllocatePool(PagedPool,
                     sizeof(RTL_QUERY_REGISTRY_TABLE) * queriesPlusOne);

    if (!parameters) {
        RS_DbgPrint("RS485NT: ExAllocatePool failed for Rtl in GetConfiguration\n");
        status = STATUS_UNSUCCESSFUL;
    } else {

        RtlZeroMemory(parameters, sizeof(RTL_QUERY_REGISTRY_TABLE) * queriesPlusOne);

        //
        // Form a path to this driver's Parameters subkey.
        //

        RtlInitUnicodeString(&parametersPath, NULL);

        parametersPath.MaximumLength = RegistryPath->Length + sizeof(L"\\Parameters");

        parametersPath.Buffer = ExAllocatePool(PagedPool, parametersPath.MaximumLength);

        if (!parametersPath.Buffer) {
            RS_DbgPrint("RS485NT: ExAllocatePool failed for Path in GetConfiguration\n");
            status = STATUS_UNSUCCESSFUL;
        }
    }

    if (NT_SUCCESS(status)) {

        //
        // Form the parameters path.
        //

        RtlZeroMemory(parametersPath.Buffer, parametersPath.MaximumLength);
        RtlAppendUnicodeToString(&parametersPath, path);
        RtlAppendUnicodeToString(&parametersPath, L"\\Parameters");

        //
        // Gather all of the "user specified" information from
        // the registry.
        //

        parameters[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
        parameters[0].Name = L"Port Address";
        parameters[0].EntryContext =  &PortAddressDefault;
        parameters[0].DefaultType = REG_DWORD;
        parameters[0].DefaultData = &notThereDefault;
        parameters[0].DefaultLength = sizeof(ULONG);

        parameters[1].Flags = RTL_QUERY_REGISTRY_DIRECT;
        parameters[1].Name = L"IRQ Line";
        parameters[1].EntryContext = &IRQLineDefault;
        parameters[1].DefaultType = REG_DWORD;
        parameters[1].DefaultData = &notThereDefault;
        parameters[1].DefaultLength = sizeof(ULONG);

        parameters[2].Flags = RTL_QUERY_REGISTRY_DIRECT;
        parameters[2].Name = L"Baud Rate";
        parameters[2].EntryContext = &BaudRateDefault;
        parameters[2].DefaultType = REG_DWORD;
        parameters[2].DefaultData = &notThereDefault;
        parameters[2].DefaultLength = sizeof(ULONG);

        parameters[3].Flags = RTL_QUERY_REGISTRY_DIRECT;
        parameters[3].Name = L"Buffer Size";
        parameters[3].EntryContext = &BufferSizeDefault;
        parameters[3].DefaultType = REG_DWORD;
        parameters[3].DefaultData = &notThereDefault;
        parameters[3].DefaultLength = sizeof(ULONG);

        status = RtlQueryRegistryValues(
                     RTL_REGISTRY_ABSOLUTE | RTL_REGISTRY_OPTIONAL,
                     parametersPath.Buffer,
                     parameters,
                     NULL,
                     NULL);

        if (!NT_SUCCESS(status)) {
            RS_DbgPrint("RS485NT: RtlQueryRegistryValues failed\n");
        }

        status = STATUS_SUCCESS;
    }

    //
    // Go ahead and assign driver defaults.
    //

    if (PortAddressDefault == notThereDefault) {
        DeviceExtension->PortAddress = (PUCHAR) DEF_PORT_ADDRESS;
    } else {
        DeviceExtension->PortAddress = (PVOID) PortAddressDefault;
    }

    if (IRQLineDefault == notThereDefault) {
        DeviceExtension->IRQLine = DEF_IRQ_LINE;
    } else {
        DeviceExtension->IRQLine = (KIRQL) IRQLineDefault;
    }

    if (BaudRateDefault == notThereDefault) {
        DeviceExtension->BaudRate = DEF_BAUD_RATE;
    } else {
        DeviceExtension->BaudRate = BaudRateDefault;
    }

    if (BufferSizeDefault == notThereDefault) {
        DeviceExtension->BufferSize = DEF_BUFFER_SIZE;
    } else {
        DeviceExtension->BufferSize = BufferSizeDefault;
    }

    //
    // Free the allocated memory before returning.
    //

    if (parametersPath.Buffer)
        ExFreePool(parametersPath.Buffer);
    if (parameters)
        ExFreePool(parameters);
    return (status);
}


//---------------------------------------------------------------------------
// Initialize_RS485
//
// Description:
//  Initializes all data structures and hardware necessary for
//  driver execution
//
// Arguments:
//      DeviceExtension - Pointer to the device extension.
//
// Return Value:
//      NSTATUS
//  
NTSTATUS Initialize_RS485 (IN PRS485NT_DEVICE_EXTENSION DeviceExtension)
{
    UCHAR       ch, Divisor;
    NTSTATUS    status = STATUS_SUCCESS;

    //
    // Initialize all of the 8250 register addresses
    //

    DeviceExtension->ComPort.RBR = DeviceExtension->PortAddress + RX_REGISTER_8250;
    DeviceExtension->ComPort.TBR = DeviceExtension->PortAddress + TX_REGISTER_8250;
    DeviceExtension->ComPort.IER = DeviceExtension->PortAddress + IER_8250;
    DeviceExtension->ComPort.IIR = DeviceExtension->PortAddress + IIR_8250;
    DeviceExtension->ComPort.LCR = DeviceExtension->PortAddress + LCR_8250;
    DeviceExtension->ComPort.MCR = DeviceExtension->PortAddress + MCR_8250;
    DeviceExtension->ComPort.LSR = DeviceExtension->PortAddress + LSR_8250;
    DeviceExtension->ComPort.MSR = DeviceExtension->PortAddress + MSR_8250;
    DeviceExtension->ComPort.BAUD = DeviceExtension->PortAddress + DIVISOR_REGISTER_8250;

    //
    // Initialize any Events
    //

    KeInitializeEvent (&DeviceExtension->XmitDone, SynchronizationEvent, FALSE);

    //
    // Allocate memory for the Transmit and Receive data buffers
    //

    DeviceExtension->RcvBuffer = ExAllocatePool(NonPagedPool, DeviceExtension->BufferSize);

    if (DeviceExtension->RcvBuffer == NULL) {
        RS_DbgPrint("RS485NT: ExAllocatePool failed for RcvBuffer\n");
        status = STATUS_INSUFFICIENT_RESOURCES;
    } else {

        //
        // Setup buffer pointers and counts
        //

        DeviceExtension->RcvBufferPosition = DeviceExtension->RcvBuffer;
        DeviceExtension->RcvBufferEnd = DeviceExtension->RcvBuffer + 
                                        (DeviceExtension->BufferSize - 1);
        DeviceExtension->RcvBufferCount = 0;

    }

    if (NT_SUCCESS(status)) {
        DeviceExtension->XmitBuffer = ExAllocatePool(NonPagedPool, DeviceExtension->BufferSize);
        if (DeviceExtension->RcvBuffer == NULL) {
            RS_DbgPrint("RS485NT: ExAllocatePool failed for XmitBuffer\n");
            status = STATUS_INSUFFICIENT_RESOURCES;
        } else {

            //
            // Setup buffer pointers and counts
            //
            DeviceExtension->XmitBufferPosition = DeviceExtension->XmitBuffer;
            DeviceExtension->XmitBufferEnd = DeviceExtension->XmitBuffer + 
                                            (DeviceExtension->BufferSize - 1);
            DeviceExtension->XmitBufferCount = 0;
        }
    }

    //
    // Clear the interrupt/error Count and get current system time

    DeviceExtension->InterruptCount = 0;
    DeviceExtension->RcvError = 0;
    KeQuerySystemTime (&DeviceExtension->LastQuerySystemTime);

    //
    // Determine the UART divisor value
    //

    switch (DeviceExtension->BaudRate) {
        case 1200:
            Divisor = BAUD_RATE_DIVISOR_1200;
            break;
        case 2400:
            Divisor = BAUD_RATE_DIVISOR_2400;
            break;
        case 4800:
            Divisor = BAUD_RATE_DIVISOR_4800;
            break;
        case 9600:
            Divisor = BAUD_RATE_DIVISOR_9600;
            break;
        case 19200:
            Divisor = BAUD_RATE_DIVISOR_19200;
            break;
        case 38400:
            Divisor = BAUD_RATE_DIVISOR_38400;
            break;
        case 57600:
            Divisor = BAUD_RATE_DIVISOR_57600;
            break;
        case 115200:
            Divisor = BAUD_RATE_DIVISOR_115200;
            break;
        default:
            Divisor = BAUD_RATE_DIVISOR_19200;
            break;
    }

    //
    // Set the baud rate to the divisor value.
    //

    ch = ((READ_PORT_UCHAR (DeviceExtension->ComPort.LCR)) | LCR_ENABLE_DIVISOR_LATCH);
    WRITE_PORT_UCHAR (DeviceExtension->ComPort.LCR, ch);

    ch = READ_PORT_UCHAR (DeviceExtension->ComPort.LCR);
    WRITE_PORT_UCHAR (DeviceExtension->ComPort.BAUD, Divisor);

    ch = ((READ_PORT_UCHAR (DeviceExtension->ComPort.LCR)) & LCR_DISABLE_DIVISOR_LATCH);
    WRITE_PORT_UCHAR (DeviceExtension->ComPort.LCR, ch);

    //
    // The data format = 1 start bit, 8 data bits, 1 stop bit, no parity.
    //

    ch = (LCR_EIGHT_BITS_PER_WORD | LCR_ONE_STOP_BIT | LCR_NO_PARITY);
    WRITE_PORT_UCHAR (DeviceExtension->ComPort.LCR, ch);

    //
    // Enable all UART interrupts on the IBM PC by asserting the GP02 general
    // purpose output. Clear all other MCR bits. Activate DTR for RS485 use.
    //

    ch = MCR_ACTIVATE_GP02 | MCR_ACTIVATE_DTR;
    WRITE_PORT_UCHAR (DeviceExtension->ComPort.MCR, ch);

    //
    // Enable Specific Interrupts
    //

    ch = (IER_ENABLE_RX_DATA_READY_IRQ | IER_ENABLE_TX_BE_IRQ | IER_ENABLE_RX_ERROR_IRQ);
    WRITE_PORT_UCHAR (DeviceExtension->ComPort.IER, ch);

    return status;
}


//---------------------------------------------------------------------------
// RS485_Write 
//
// Description:
//  Called by DispatchRoutine in response to a Write request.
//
// Arguments:
//      DeviceExtension - The device extension strtucture
//      Irp             - The Irp associated with this IO
//
// Return Value:
//      NTSTATUS
//
NTSTATUS RS485_Write (IN PRS485NT_DEVICE_EXTENSION  DeviceExtension, IN PIRP Irp)
{
    ULONG   Length;
    UCHAR   ch;

    Length = IoGetCurrentIrpStackLocation(Irp)->Parameters.Write.Length;
    Irp->IoStatus.Information = 0L;

    //
    // Check for a zero length write.
    //

    if (Length) {

        if (Length >= DeviceExtension->BufferSize) {

            //
            // Not enough room in the buffer
            //

            Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
        } else {

            //
            // Clear the Transmit complete event
            //

            KeClearEvent (&DeviceExtension->XmitDone);

            //
            // Copy the buffer into the DeviceExtension
            //

            RtlMoveMemory (DeviceExtension->XmitBuffer, 
                           Irp->AssociatedIrp.SystemBuffer, Length);

            DeviceExtension->XmitBufferCount = Length;
            DeviceExtension->XmitBufferPosition = DeviceExtension->XmitBuffer;

            //
            // Assert RTS
            //

            ch = READ_PORT_UCHAR (DeviceExtension->ComPort.MCR) | MCR_ACTIVATE_RTS;
            WRITE_PORT_UCHAR (DeviceExtension->ComPort.MCR, ch);

            //
            // Kick start the UART by jamming one byte out
            //

            WRITE_PORT_UCHAR (DeviceExtension->ComPort.TBR, 
                              *DeviceExtension->XmitBufferPosition);

            DeviceExtension->XmitBufferPosition++;
            DeviceExtension->XmitBufferCount--;

            //
            // Wait for the complete buffer to be sent
            //
            RS_DbgPrint ("RS485NT: Write KeWaitForSingleObject\n");
            KeWaitForSingleObject (&DeviceExtension->XmitDone, Executive, 
                                   FALSE, KernelMode, NULL);

            //
            // Set the number of bytes written
            //

            Irp->IoStatus.Information = Length;
        }

    } else {
        //
        // Nothing to write, so return SUCCESS (and do nothing!)
        //
        Irp->IoStatus.Status = STATUS_SUCCESS;
    }

    return STATUS_SUCCESS;
}


//---------------------------------------------------------------------------
// RS485_Read
//
// Description:
//  Called by DispatchRoutine in response to a Read request.
//
// Arguments:
//      DeviceExtension - The device extension strtucture
//      Irp             - The Irp associated with this IO
//
// Return Value:
//      NTSTATUS
//
NTSTATUS RS485_Read (IN PRS485NT_DEVICE_EXTENSION  DeviceExtension, IN PIRP Irp)
{
    ULONG   Length;
    KIRQL   OldIrql;
    
    Length = IoGetCurrentIrpStackLocation(Irp)->Parameters.Read.Length;
    Irp->IoStatus.Information = 0L;

    //
    // Check for a zero length read.
    //

    if (Length) {

        //
        // Read in the minimum amount (User buffer or Device Extension buffer)
        //

        if (Length > DeviceExtension->RcvBufferCount) {
            Length = DeviceExtension->RcvBufferCount;
        }

        //
        // Synchronize - LOCK
        //

        KeRaiseIrql ((KIRQL)(DeviceExtension->Irql+1), &OldIrql);

        //
        // Copy the buffer from the DeviceExtension
        //
        RtlMoveMemory (Irp->AssociatedIrp.SystemBuffer, 
                       DeviceExtension->RcvBuffer, Length);

        //
        // Clear the Rcv buffer info
        //

        DeviceExtension->RcvBufferCount = 0;
        DeviceExtension->RcvBufferPosition = DeviceExtension->RcvBuffer;

        //
        // Synchronize - UNLOCK
        //

        KeLowerIrql (OldIrql);

        //
        // Set the number of bytes actually read
        //

        Irp->IoStatus.Information = Length;

    } else {
        //
        // Nothing to read, so return SUCCESS (and do nothing!)
        //
        Irp->IoStatus.Status = STATUS_SUCCESS;
    }

    return STATUS_SUCCESS;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品视频在线| 视频一区欧美日韩| 久久91精品国产91久久小草| 欧美三级韩国三级日本一级| 亚洲欧美另类综合偷拍| 一本到一区二区三区| 国产精品蜜臀在线观看| 成人午夜激情在线| 国产精品嫩草影院av蜜臀| 午夜免费久久看| 欧美日韩国产片| 亚洲午夜在线视频| 91精品国产美女浴室洗澡无遮挡| 三级欧美在线一区| 日韩亚洲电影在线| 国产九色sp调教91| 久久综合九色综合97_久久久| 国产自产v一区二区三区c| 中文字幕在线一区免费| 一本一本大道香蕉久在线精品| 欧美激情资源网| 精品1区2区3区| 秋霞影院一区二区| 国产精品欧美一级免费| 99re这里只有精品视频首页| 一区二区三区在线免费播放| 日韩一区二区麻豆国产| 国产精品伊人色| 综合久久国产九一剧情麻豆| 欧美一区二区三区视频| 国产一区二区看久久| 亚洲国产精品一区二区久久| 日韩无一区二区| jiyouzz国产精品久久| 午夜久久久影院| 国产情人综合久久777777| 欧美日韩一本到| 国产乱一区二区| 亚洲成a天堂v人片| 亚洲日本va午夜在线影院| 欧美一级淫片007| 91在线看国产| 久久电影国产免费久久电影 | 欧美性大战久久久久久久蜜臀 | 91福利精品视频| 激情图片小说一区| 亚洲精品国久久99热| 精品对白一区国产伦| 色网综合在线观看| 国产在线不卡视频| 日产欧产美韩系列久久99| 国产精品欧美综合在线| 精品久久久久久久久久久久久久久久久| www.日本不卡| 一二三四区精品视频| 国产精品久线观看视频| 日韩精品在线网站| 欧美一区二区三区不卡| 91片黄在线观看| 成人性视频网站| 久久99国产精品成人| 一区二区三区影院| 国产精品沙发午睡系列990531| 91精品在线一区二区| 欧美日韩一卡二卡三卡| 成人国产精品免费观看视频| 亚洲综合丝袜美腿| 亚洲丝袜制服诱惑| 久久九九99视频| 久久免费视频色| 精品剧情v国产在线观看在线| 555夜色666亚洲国产免| 欧美专区亚洲专区| 在线中文字幕一区二区| 9色porny自拍视频一区二区| 国产一区二区精品在线观看| 美腿丝袜亚洲综合| 日韩精品电影一区亚洲| 日日摸夜夜添夜夜添精品视频 | 99视频精品在线| 成人综合激情网| 国产激情91久久精品导航| 国产精品1区二区.| 国产精品123| 狠狠狠色丁香婷婷综合久久五月| 日韩一区精品视频| 丝袜亚洲精品中文字幕一区| 三级亚洲高清视频| 免费观看日韩电影| 捆绑紧缚一区二区三区视频| 麻豆精品久久久| 国产精品久久久久久户外露出 | 91精品久久久久久久91蜜桃| 欧美美女喷水视频| 欧美肥妇毛茸茸| 欧美一区二区三区人| 26uuu国产在线精品一区二区| 欧美α欧美αv大片| 亚洲精品一区二区三区福利| 精品国产免费久久| 久久久久久麻豆| 中文无字幕一区二区三区| 亚洲国产成人私人影院tom| 欧美国产精品专区| 亚洲女同一区二区| 午夜免费欧美电影| 美女视频一区二区| 国产一二三精品| 不卡在线视频中文字幕| 91免费在线看| 欧美午夜免费电影| 精品欧美乱码久久久久久1区2区| 欧美精品一区二区三| 国产女同互慰高潮91漫画| 国产精品成人免费在线| 亚洲国产人成综合网站| 理论电影国产精品| 理论电影国产精品| 成人免费看视频| 91传媒视频在线播放| 日韩欧美国产不卡| 欧美mv和日韩mv国产网站| 国产精品婷婷午夜在线观看| 亚洲美女屁股眼交| 免费在线观看视频一区| 国产成都精品91一区二区三| 色综合色综合色综合| 欧美一区二区不卡视频| 国产精品久久久久久久久免费桃花| 18欧美亚洲精品| 日韩—二三区免费观看av| 成人涩涩免费视频| 欧美日韩一区二区在线观看| 精品电影一区二区三区| 亚洲男人的天堂av| 麻豆91在线观看| 91玉足脚交白嫩脚丫在线播放| 欧美人妇做爰xxxⅹ性高电影 | 久久免费精品国产久精品久久久久| 亚洲欧洲性图库| 久久国产精品免费| 在线观看三级视频欧美| 精品国产91久久久久久久妲己| 18欧美亚洲精品| 国产麻豆一精品一av一免费| 在线免费亚洲电影| 精品精品欲导航| 亚洲国产一区视频| 国产精品系列在线播放| 欧美私人免费视频| 国产精品伦一区二区三级视频| 天堂蜜桃91精品| 色综合久久88色综合天天| 久久综合久久久久88| 天堂精品中文字幕在线| 99久久国产免费看| 国产欧美精品在线观看| 久久精品国产亚洲aⅴ| 一本色道**综合亚洲精品蜜桃冫 | 成人动漫中文字幕| 日韩欧美国产系列| 偷偷要91色婷婷| 91香蕉视频污在线| 欧美国产激情二区三区| 紧缚捆绑精品一区二区| 欧美日韩国产在线播放网站| 中文字幕在线观看一区二区| 国产黄人亚洲片| ww久久中文字幕| 麻豆免费看一区二区三区| 欧美日韩二区三区| 亚洲图片欧美视频| 在线看一区二区| 亚洲免费观看高清完整版在线观看熊 | 不卡视频一二三| 久久亚洲欧美国产精品乐播| 亚洲婷婷在线视频| 国产成人精品www牛牛影视| 精品日韩一区二区三区免费视频| 国产精品成人一区二区艾草| 99精品久久免费看蜜臀剧情介绍| 一区二区三区中文字幕电影| 欧美日韩精品免费| 韩国av一区二区三区| 中文字幕视频一区二区三区久| 91美女片黄在线观看91美女| 日韩精品一二三| 久久久亚洲欧洲日产国码αv| 波多野结衣精品在线| 亚洲va欧美va人人爽午夜| 精品国产在天天线2019| 9l国产精品久久久久麻豆| 亚洲国产一二三| 欧美大片在线观看一区| 99热99精品| 欧美bbbbb| 亚洲视频一区二区免费在线观看| 欧美高清精品3d| www.视频一区| 国产老肥熟一区二区三区|