Не могу запустить чтение по изохронки с использованием BeginDataXfer, WaitForXfer и FinishDataXfer. Для примера взял кусок проги из помощи по cyusb.sys и вставил в тестовую программу. Проблема в том что после запуска потока на чтение происходит постоянное выделение памяти в диспетчере задач и в результате комп идет на перезагрузку.
Если у кого есть кусок кода с использованием этой связки выложите сюда плиз. Для ясности вставлю свой (ногами не пинать, опыта программирования на C# немного

Запуск потока:
ThreadClass.CallbackMethod x = new ThreadClass.CallbackMethod(ResultCallback);
ThreadClass ThreadIso = new ThreadClass("IsoThread", ref myDev, ref EP2, x );
Thread IsoThread = new Thread(new ThreadStart(ThreadIso.ListenThread));
IsoThread.Start();
class ThreadClass
{
string ThreadName;
CyUSB.CyUSBDevice myDevx;
CyUSB.CyIsocEndPoint EPx;
private CallbackMethod callback;
public delegate void CallbackMethod();
internal struct OVERLAPPED
{
public int Internal;
public int InternalHigh;
public uint Offset;
public uint OffsetHigh;
public uint hEvent;
}
public ThreadClass(string name, ref CyUSB.CyUSBDevice myDevxx, ref CyUSB.CyIsocEndPoint EPxx, CallbackMethod callbackDelegate)
{
ThreadName = name;
myDevx = myDevxx;
EPx = EPxx;
callback = callbackDelegate;
}
public unsafe void ListenThread()
{
if (myDevx == null)
{
return;
}
byte i = 0;
int BufSz = (int)(EPx.MaxPktSize * 80U);
int QueueSz = 8; //Количество буферов для чтения изохронного канал
EPx.XferSize = BufSz;
// Setup the queue buffers
byte[][] cmdBufs = new byte[QueueSz][];
byte[][] xferBufs = new byte[QueueSz][];
byte[][] ovLaps = new byte[QueueSz][];
CyUSB.ISO_PKT_INFO[][] pktInfos = new CyUSB.ISO_PKT_INFO[QueueSz][];
for (i = 0; i < QueueSz; i++)
{
cmdBufs[i] = new byte[CyUSB.CyConst.SINGLE_XFER_LEN + EPx.GetPktBlockSize(BufSz)];
pktInfos[i] = new CyUSB.ISO_PKT_INFO[EPx.GetPktCount(BufSz)];
xferBufs[i] = new byte[BufSz];
ovLaps[i] = new byte[20];
fixed (byte* tmp0 = ovLaps[i])
{
OVERLAPPED* ovLapStatus = (OVERLAPPED*)tmp0;
ovLapStatus->hEvent = (uint) CyUSB.PInvoke.CreateEvent(0, 0, 0, 0);
}
}
// Pre-load the queue with requests
//Запускаем 8 очередей на чтение данных с изохронного эндпоинта
int len = BufSz;
for (i = 0; i < QueueSz; i++)
{
EPx.BeginDataXfer(ref cmdBufs[i], ref xferBufs[i], ref len, ref ovLaps[i]);
}
i = 0;
for (; true; )
{
fixed (byte* tmp0 = ovLaps[i])
{
OVERLAPPED* ovLapStatus = (OVERLAPPED*)tmp0;
if (!EPx.WaitForXfer(ovLapStatus->hEvent, 500))
{
EPx.Abort();
CyUSB.PInvoke.WaitForSingleObject(ovLapStatus->hEvent, 500);
}
}
if (EPx.FinishDataXfer(ref cmdBufs[i], ref xferBufs[i], ref len, ref ovLaps[i], ref pktInfos[i]))
{
callback();
}
// Re-submit this buffer into the queue
len = BufSz;
EPx.BeginDataXfer(ref cmdBufs[i], ref xferBufs[i], ref len, ref ovLaps[i]);
i++;
if (i == QueueSz)
{
Thread.Sleep(0);
i = 0;
}
}
}
}