diaryon
驱动牛犊
驱动牛犊
  • 注册日期2004-12-04
  • 最后登录2008-10-04
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望4点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:4213回复:27

ISA驱动源码,IO+IRQ,安装文件INF

楼主#
更多 发布于:2004-12-27 08:05
我有ISA驱动源码,IO+IRQ,安装文件INF
QQ:251753978
Emking_Yan
驱动牛犊
驱动牛犊
  • 注册日期2004-12-12
  • 最后登录2006-12-20
  • 粉丝0
  • 关注0
  • 积分113分
  • 威望13点
  • 贡献值0点
  • 好评度10点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-12-27 11:09
楼主给发一个好吗??谢谢
lafite@sohu.com
FMMU_Mammoth
驱动牛犊
驱动牛犊
  • 注册日期2004-11-10
  • 最后登录2004-12-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-27 18:35
这个。。免费的把?
我要这天,再遮不住我眼, 要这地,再埋不了我心, 要这众生,都明白我意, 要那诸佛,都烟消云散 [img]http://www.life-abroad.com/forum/UploadFile/2004-9/200493115610468.gif[/img]
barton
驱动牛犊
驱动牛犊
  • 注册日期2003-06-10
  • 最后登录2008-12-18
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望52点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-02 14:54
给偶一份好不?
pangshengjin@163.com
清风拂柳
xipzh
驱动牛犊
驱动牛犊
  • 注册日期2002-11-28
  • 最后登录2005-02-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-05 16:00
给我也发一份,OK?
xi_pzh@263.net
ddk新手
JasonClark
驱动牛犊
驱动牛犊
  • 注册日期2005-01-05
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-06 00:46
inducement
linuxmo
驱动牛犊
驱动牛犊
  • 注册日期2005-01-15
  • 最后登录2005-01-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-16 12:30
楼主我想要。
netroot@21cn.com
hglzw
驱动小牛
驱动小牛
  • 注册日期2001-06-12
  • 最后登录2006-03-03
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-21 08:59
搂住最好把它传到本站上来
[img]http://www.kinboh.com/images/5130.jpg[/img]
popyang
驱动牛犊
驱动牛犊
  • 注册日期2005-01-30
  • 最后登录2005-04-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-30 20:45
是啊,用来学习还是蛮好的!
我也要一份
pop_yang@163.net
sunvan
驱动牛犊
驱动牛犊
  • 注册日期2004-03-12
  • 最后登录2011-07-06
  • 粉丝0
  • 关注0
  • 积分-100分
  • 威望-9点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-02-15 11:45
give me a copy ,
email: sunvan_hu@163.com
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-02-15 12:44
我有ISA驱动源码,IO+IRQ,安装文件INF
QQ:251753978

如果是想共享就放上来,如果是要卖钱就明说,弄得那么多人这里喊,其实这样的驱动是非常简单的,也大可不必这里卖关子
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
cuiyan1997
驱动牛犊
驱动牛犊
  • 注册日期2003-04-04
  • 最后登录2011-03-13
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-05-01 15:06
您好,能发给我吗?万分感谢。
wangyueying@126.com
enjoylwc
驱动牛犊
驱动牛犊
  • 注册日期2005-03-25
  • 最后登录2005-07-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-05-07 10:38
我也需要一份。
linweichuan@sohu.com
wonder_2001
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2010-12-03
  • 粉丝0
  • 关注0
  • 积分452分
  • 威望96点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-05-12 17:50
大哥帮帮忙给我一份,急需
wonder_2001
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2010-12-03
  • 粉丝0
  • 关注0
  • 积分452分
  • 威望96点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-05-12 17:51
sorry 我的  email : wonder_2001@163.com
cuiyan1997
驱动牛犊
驱动牛犊
  • 注册日期2003-04-04
  • 最后登录2011-03-13
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-05-13 11:07
ISA的其实很简单,用driverworks按提示一步步操作下去即可,不用给我发了。
myxeei316
驱动牛犊
驱动牛犊
  • 注册日期2004-03-18
  • 最后登录2005-05-21
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-05-17 16:40
给我发一份可以吗?myxeei316@sina.com
limengsk
驱动牛犊
驱动牛犊
  • 注册日期2005-03-18
  • 最后登录2010-04-14
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-05-19 11:10
可以给我一份吗?谢谢~!
li-mn@163.com
xef2000
驱动牛犊
驱动牛犊
  • 注册日期2001-11-25
  • 最后登录2010-11-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-05-24 18:36
可以给我一份吗?谢谢~!
xue_feng2005@126.com
diaryon
驱动牛犊
驱动牛犊
  • 注册日期2004-12-04
  • 最后登录2008-10-04
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望4点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-05-30 08:44
没有发现这么多人要
*******************************************
//
// Driver.c - Chapter 7 - Loopback Driver
//
// Copyright (C) 2000 by Jerry Lozano
//

#include \"Driver.h\"
#include \"stdlib.h\"
#include <math.h>

// Forward declarations
//
static NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject,IN ULONG ulDeviceNumber);
static VOID DriverUnload (IN PDRIVER_OBJECT pDriverObject);
static NTSTATUS DispatchCreate (IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);
static NTSTATUS DispatchClose (IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);
static NTSTATUS DispatchDeviceControl (IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp) ;

BOOLEAN Isr (IN PKINTERRUPT pIntObj,IN PVOID pServiceContext);

bool LockAdContext( PDEVICE_EXTENSION pDevExt, void * pInBuf, __int32 inLength );
void UnLockAdContext(PDEVICE_EXTENSION pDevExt);
bool LockBuffers(PDEVICE_EXTENSION pDevExt);
void UnLockBuffers(PDEVICE_EXTENSION pDevExt);
void EnableDynamicAcq(PDEVICE_EXTENSION pDevExt);
void DisableDynamicAcq(PDEVICE_EXTENSION pDevExt);
void RollBackData(PDEVICE_EXTENSION pDevExt);
void RefreshZeros(PDEVICE_EXTENSION pDevExt);
void DumpAdContext(PDEVICE_EXTENSION pDevExt);

extern \"C\"
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{
ULONG ulDeviceNumber = 0;
NTSTATUS status;

// Announce other driver entry points
pDriverObject->DriverUnload = DriverUnload;
// This includes Dispatch routines for Create
pDriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;

// For each physical or logical device detected
// that will be under this Driver\'s control,
// a new Device object must be created.
status = CreateDevice(pDriverObject, ulDeviceNumber);
return status;
}

NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject, IN ULONG ulDeviceNumber)
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;
PDEVICE_EXTENSION pDevExt;

// Form the internal Device Name
CUString devName(\"\\\\Device\\\\Gcu2kSampleDevice\");
devName += CUString(ulDeviceNumber);

// Now create the device
status = IoCreateDevice(pDriverObject,
sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)devName,
FILE_DEVICE_UNKNOWN,
0, TRUE,
&pDevObj );
if (!NT_SUCCESS(status))
return status;

// Announce that we will be working with a copy of the user\'s buffer
pDevObj->Flags |= DO_BUFFERED_IO;

// Initialize the Device Extension
pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
pDevExt->pDevice = pDevObj; // back pointer
pDevExt->DeviceNumber = ulDeviceNumber;
pDevExt->ustrDeviceName = devName;

pDevExt->spinLock = 0;
pDevExt->isrControlCode = 0;
pDevExt->pIntObj = NULL;

pDevExt->pMdlAdContext = NULL;
pDevExt->pLockedAdContext = NULL;

pDevExt->bLockAdContext = false;
pDevExt->bLockBuffers = false;
pDevExt->enableDynamicAcq = 0;
pDevExt->enableStaticAcq = 0;

// Create & connect to an Interrupt object
// To make interrupts real, we must translate irq into
// a HAL irq and vector (with processor affinity)
KIRQL kIrql;
KAFFINITY kAffinity;
ULONG kVector =HalGetInterruptVector(Isa, 0, IRQ, 0, &kIrql, &kAffinity);

//DbgPrint(\"Interrupt %x converted: kIrql = %x, kAffinity = %x, kVector = %x\\n\",
// IRQ, kIrql, kAffinity, kVector);

status =IoConnectInterrupt(
&pDevExt->pIntObj, // the Interrupt object
Isr, // our ISR
pDevExt, // Service Context
NULL, // no spin lock
kVector, // vector
kIrql, // DIRQL
kIrql, // DIRQL
Latched, // Latched or LevelSensitive
TRUE, // Shared?
kAffinity, // processors in an MP set
FALSE ); // save FP registers?
if (!NT_SUCCESS(status)) {
DbgPrint(\" IoConnectInterrupt failed\");
IoDeleteDevice( pDevObj );
return status;
}

// Form the symbolic link name
CUString symLinkName(\"\\\\??\\\\Gcu2kSampleDevice\");
symLinkName += CUString(ulDeviceNumber+1); // 1 based
pDevExt->ustrSymLinkName = symLinkName;

// Now create the link name
status = IoCreateSymbolicLink( &(UNICODE_STRING)symLinkName,&(UNICODE_STRING)devName );
if (!NT_SUCCESS(status)) {
IoDeleteDevice( pDevObj );
return status;
}

return STATUS_SUCCESS;
}


NTSTATUS DispatchCreate(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0; // no bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
}

NTSTATUS DispatchClose(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
// Dig out the Device Extension from the Device object
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION) pDevObj->DeviceExtension;

if(pDevExt->enableDynamicAcq)
DisableDynamicAcq(pDevExt);

if(pDevExt->bLockBuffers)
UnLockBuffers(pDevExt);

if(pDevExt->bLockAdContext)
UnLockAdContext(pDevExt);

pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0; // no bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
}


VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT pNextObj;

// Loop through each device controlled by Driver
pNextObj = pDriverObject->DeviceObject;
while (pNextObj != NULL) {
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION) pNextObj->DeviceExtension;

// Delete our Interrupt object
if (pDevExt->pIntObj)
IoDisconnectInterrupt( pDevExt->pIntObj );

UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
IoDeleteSymbolicLink(&pLinkName);
pNextObj = pNextObj->NextDevice;
IoDeleteDevice( pDevExt->pDevice );
}
}

bool LockAdContext(PDEVICE_EXTENSION pDevExt, void *pInBuf, __int32 inLength)
{
if(pDevExt->bLockAdContext)
return true;

InterlockedExchange(&(pDevExt->spinLock), 1);
__try{
AdContext *pUserAdContext = (AdContext *)pInBuf;
pDevExt->pUserAdContext = pUserAdContext;
PMDL pMdl = IoAllocateMdl(pUserAdContext, inLength, FALSE, TRUE, NULL);
pDevExt->pMdlAdContext = pMdl;
MmProbeAndLockPages(pMdl, UserMode,IoModifyAccess);
pDevExt->pLockedAdContext = (AdContext *)MmGetSystemAddressForMdlSafe(pMdl, NormalPagePriority);
pDevExt->bLockAdContext = true;
DbgPrint(\"driver: lock AdContext success\");
}__except (1){
pDevExt->pMdlAdContext = NULL;
pDevExt->pLockedAdContext = NULL;
DbgPrint(\"driver: failed to lock AdContext\");
}
InterlockedExchange(&(pDevExt->spinLock),0);
return pDevExt->bLockAdContext;
}

void UnLockAdContext(PDEVICE_EXTENSION pDevExt)
{
if(!pDevExt->bLockAdContext)
return ;

InterlockedExchange(&(pDevExt->spinLock),1);
{
MmUnlockPages(pDevExt->pMdlAdContext);
IoFreeMdl(pDevExt->pMdlAdContext);
pDevExt->pMdlAdContext = NULL;
pDevExt->pLockedAdContext = NULL;
pDevExt->bLockAdContext = false;
DbgPrint(\"driver: unlock AdContext success\");
}
InterlockedExchange(&(pDevExt->spinLock),0);
}


bool LockBuffers(PDEVICE_EXTENSION pDevExt)
{
if(!pDevExt->bLockAdContext){
DbgPrint(\"driver: failed to lock buffers due to failed lock AdContext\");
return false;
}

if(pDevExt->bLockBuffers){
DbgPrint(\"driver: Try to lock buffers twice\");
return true;
}

InterlockedExchange(&(pDevExt->spinLock), 1);
__try{
PMDL pMdl;
int dynamicBufWords = pDevExt->pLockedAdContext->DBufBoundWords;
for(int i=0; i<pDevExt->pLockedAdContext->adsNumber; i++){
pMdl = IoAllocateMdl(pDevExt->pLockedAdContext->ad.pBuf, dynamicBufWords*2,FALSE,TRUE,NULL);
pDevExt->pLockedAdContext->ad.pMdl = pMdl;
MmProbeAndLockPages(pMdl, UserMode,IoModifyAccess);
pDevExt->pLockedAdContext->ad.pMapBuf = (unsigned short *)MmGetSystemAddressForMdlSafe(pMdl,NormalPagePriority);
}
pDevExt->bLockBuffers = true;
DbgPrint(\"driver: lock buffers success\");

//Start first A/D
for(i=0; i<pDevExt->pLockedAdContext->adsNumber; i++)
WRITE_PORT_USHORT( &(pDevExt->pLockedAdContext->ad.startPort),0);

//Delay 15 microSeconds
//LARGE_INTEGER  interval;
//KeDelayExecutionThread(KernelMode,FALSE,&interval);

}__except (1){
for(int i=0; i<pDevExt->pLockedAdContext->adsNumber; i++){
pDevExt->pLockedAdContext->ad.pMdl = NULL;
pDevExt->pLockedAdContext->ad.pMapBuf = NULL;
}
DbgPrint(\"driver: failed to lock buffers\");
}
InterlockedExchange(&(pDevExt->spinLock),0);
return pDevExt->bLockBuffers;
}

void UnLockBuffers(PDEVICE_EXTENSION pDevExt)
{
if(!pDevExt->bLockBuffers)
return ;

InterlockedExchange(&(pDevExt->spinLock), 1);
{
pDevExt->isrControlCode = 0;

for(int i=0; i<pDevExt->pLockedAdContext->adsNumber; i++)
if(pDevExt->pLockedAdContext->ad.pMdl != NULL){
MmUnlockPages(pDevExt->pLockedAdContext->ad.pMdl);
IoFreeMdl(pDevExt->pLockedAdContext->ad.pMdl);
pDevExt->pLockedAdContext->ad.pMdl = NULL;
pDevExt->pLockedAdContext->ad.pMapBuf = NULL;
}
pDevExt->bLockBuffers = false;
DbgPrint(\"driver: unlock buffers success\");
}
InterlockedExchange(&(pDevExt->spinLock),0);
}

void EnableDynamicAcq(PDEVICE_EXTENSION pDevExt)
{
InterlockedExchange(&(pDevExt->spinLock), 1);
InterlockedExchange(&(pDevExt->enableDynamicAcq), 1);
InterlockedExchange(&(pDevExt->spinLock),0);
}

void DisableDynamicAcq(PDEVICE_EXTENSION pDevExt)
{
InterlockedExchange(&(pDevExt->spinLock), 1);
InterlockedExchange(&(pDevExt->enableDynamicAcq), 0);
InterlockedExchange(&(pDevExt->spinLock),0);
}

void StartStaticAcq(PDEVICE_EXTENSION pDevExt)
{
InterlockedExchange(&(pDevExt->spinLock), 1);
if(pDevExt->pLockedAdContext->SBufBoundWords > SBUFBOUNDWORDS)
pDevExt->pLockedAdContext->SBufBoundWords = SBUFBOUNDWORDS;

pDevExt->pLockedAdContext->staticIndex = 0;
for(int i=0; i<pDevExt->pLockedAdContext->adsNumber; i++){
pDevExt->pLockedAdContext->ad.staticSumAd = 0;
for(int j=0; j<pDevExt->pLockedAdContext->SBufBoundWords; j++)
pDevExt->pLockedAdContext->ad.staticAd[j] = 0;
}
InterlockedExchange(&(pDevExt->enableStaticAcq), 1);
InterlockedExchange(&(pDevExt->spinLock),0);
}

void StopStaticAcq(PDEVICE_EXTENSION pDevExt)
{
InterlockedExchange(&(pDevExt->spinLock), 1);
InterlockedExchange(&(pDevExt->enableStaticAcq), 0);
InterlockedExchange(&(pDevExt->spinLock),0);
}

void RollBackData(PDEVICE_EXTENSION pDevExt)
{
//roll data back with 50 words
if(!pDevExt->bLockBuffers)
return ;

InterlockedExchange(&(pDevExt->spinLock), 1);

for(int i=0; i<pDevExt->pLockedAdContext->adsNumber; i++)
for(int j=50; j<pDevExt->pLockedAdContext->validWords; j++)
pDevExt->pLockedAdContext->ad.pMapBuf[j-50] = pDevExt->pLockedAdContext->ad.pMapBuf[j];
pDevExt->pLockedAdContext->validWords-=50;

InterlockedExchange(&(pDevExt->spinLock),0);
}

void RefreshZeros(PDEVICE_EXTENSION pDevExt)
{
//roll data back with 50 words
if(!pDevExt->bLockBuffers)
return ;

InterlockedExchange(&(pDevExt->spinLock), 1);
//用最前面的200个word的平均值更新零点
for(int i=0; i<pDevExt->pLockedAdContext->adsNumber; i++){
for(unsigned int sum=0,j=0; j<200; j++)
sum += pDevExt->pLockedAdContext->ad.pMapBuf[j];
pDevExt->pLockedAdContext->ad.pMapBuf[0] = sum/200;
}

InterlockedExchange(&(pDevExt->spinLock),0);
}

NTSTATUS DispatchDeviceControl(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp)
{
NTSTATUS status = STATUS_SUCCESS;
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
PIO_STACK_LOCATION pIrpStack =IoGetCurrentIrpStackLocation( pIrp );
ULONG ioControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;

void * pInBuf = (__int32 *) pIrpStack->Parameters.DeviceIoControl.Type3InputBuffer;
__int32 inLength = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;

    switch (ioControlCode) {
case IOCTL_LOCK_AD_CONTEXT:
if(!LockAdContext(pDevExt, pInBuf, inLength))
status=STATUS_NOT_MAPPED_DATA;
break;

case IOCTL_UNLOCK_AD_CONTEXT:
UnLockAdContext(pDevExt);
break;

case IOCTL_LOCK_BUFFERS:
if(!LockBuffers(pDevExt))
status=STATUS_NOT_MAPPED_DATA;
break;

case IOCTL_UNLOCK_BUFFERS:
UnLockBuffers(pDevExt);
break;

case IOCTL_START_DYNAMIC_ACQ:
pDevExt->firstAcq=1;
EnableDynamicAcq(pDevExt);
break;

case IOCTL_START_STATIC_ACQ:
StartStaticAcq(pDevExt);
break;

case IOCTL_STOP_STATIC_ACQ:
StopStaticAcq(pDevExt);
break;

case IOCTL_STOP_DYNAMIC_ACQ:
DisableDynamicAcq(pDevExt);
break;

case IOCTL_ROLL_BACK_DATA:
RollBackData(pDevExt);
break;

case IOCTL_REFRESH_ZEROS:
RefreshZeros(pDevExt);
break;

case IOCTL_DUMP_AD_CONTEXT:
DumpAdContext(pDevExt);
break;
case IOCTL_OPEN_XCJP:
OpenXcjp(pDevExt);
break;
case IOCTL_CLOSE_XCJP:
CloseXcjp(pDevExt);
break;
default:
DbgPrint(\"invalid ioControlCode\");
status = STATUS_INVALID_DEVICE_REQUEST;
break;
}

pIrp->IoStatus.Information = 0;
pIrp->IoStatus.Status = status;

IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return status;
}

void DumpAdContext(PDEVICE_EXTENSION pDevExt)
{
if(!pDevExt->bLockAdContext){
DbgPrint(\"AdContext has not been locked!\");
return;
}

DbgPrint(\"pUserAdContext=%x\",pDevExt->pUserAdContext);
DbgPrint(\"pLockedAdContext=%x\",pDevExt->pLockedAdContext);
DbgPrint(\"DBufBoundWords=%d\",pDevExt->pLockedAdContext->DBufBoundWords);
DbgPrint(\"validWords=%d\",pDevExt->pLockedAdContext->validWords);

DbgPrint(\"adsNumber=%d\",pDevExt->pLockedAdContext->adsNumber);
for(int i=0; i<pDevExt->pLockedAdContext->adsNumber; i++){
DbgPrint(\"Ad[%d].startPort=%x\",i,pDevExt->pLockedAdContext->ad.startPort);
DbgPrint(\"Ad[%d].dataport=%x\",i,pDevExt->pLockedAdContext->ad.dataport);
DbgPrint(\"Ad[%d].pBuf=%x\",i,pDevExt->pLockedAdContext->ad.pBuf);

if(!pDevExt->bLockBuffers)
DbgPrint(\"Ad[%d].pMapBuf=%x,buffer has not been locked\",i,pDevExt->pLockedAdContext->ad.pMapBuf);
else
DbgPrint(\"Ad[%d].pMapBuf=%x\",i,pDevExt->pLockedAdContext->ad.pMapBuf);
}
}

BOOLEAN Isr(IN PKINTERRUPT pIntObj,IN PVOID pServiceContext)
{
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pServiceContext;

if((pDevExt->spinLock) || (!pDevExt->bLockAdContext))
return TRUE;

AdContext *pLockedAdContext = pDevExt->pLockedAdContext;

// read current A/D
if((pDevExt->enableStaticAcq) || (pDevExt->enableDynamicAcq))
for(int i=0; i<pLockedAdContext->adsNumber; i++)
pLockedAdContext->ad.currentAd =
READ_PORT_USHORT((PUSHORT)(pLockedAdContext->ad.dataport))>>1;

// static acquire
if(pDevExt->enableStaticAcq){
for(int i=0; i<pLockedAdContext->adsNumber; i++){
pLockedAdContext->ad.staticSumAd -=
pLockedAdContext->ad.staticAd[pLockedAdContext->staticIndex];

pLockedAdContext->ad.staticAd[pLockedAdContext->staticIndex] =
pLockedAdContext->ad.currentAd;

pLockedAdContext->ad.staticSumAd += pLockedAdContext->ad.currentAd;

pLockedAdContext->ad.averageAd = (unsigned short)
(pLockedAdContext->ad.staticSumAd / pLockedAdContext->SBufBoundWords);
}

pLockedAdContext->staticIndex++;
if(pLockedAdContext->staticIndex == pLockedAdContext->SBufBoundWords)
pLockedAdContext->staticIndex = 0;
}

// dynamic acquire
if(pDevExt->enableDynamicAcq){
if(pLockedAdContext->validWords >= pLockedAdContext->DBufBoundWords){
DbgPrint(\"Isr overflow to upper!\");
return true;
}

for(int i=0; i<pLockedAdContext->adsNumber; i++)
pLockedAdContext->ad.pMapBuf[pLockedAdContext->validWords] =
pLockedAdContext->ad.currentAd;

if(1==pDevExt->firstAcq){
pDevExt->firstAcq=0;
}else{
pLockedAdContext->validWords++;
}
}

// start next A/D
WRITE_PORT_USHORT((PUSHORT)(pLockedAdContext->ad[0].startPort),0);

for(int i=1; i<pLockedAdContext->adsNumber; i++){
bool bSameStartPort=false;

for(int j=0;j<=i-1;j++)
if(pLockedAdContext->ad.startPort==pLockedAdContext->ad[j].startPort)
bSameStartPort=true;

if(!bSameStartPort)
WRITE_PORT_USHORT( (PUSHORT)(pLockedAdContext->ad.startPort),0);
}

return TRUE;
}




上一页
游客

返回顶部