Моя компания разрабатывает оборудование, которое должно взаимодействовать с программным обеспечением.Для этого мы создали драйвер, который позволяет записывать и читать с аппаратного обеспечения.Чтобы получить доступ к драйверу, мы используем команду:
HANDLE device = CreateFile(DEVICE_NAME,
GENERIC_READ | GENERIC_WRITE,
0x00000007,
&sec,
OPEN_EXISTING,
0,
NULL);
Чтение и запись выполняется с использованием функций:
WriteFile(device,&package,package.datasize,&bytesWritten,NULL);
и
ReadFile(device,returndata,returndatasize,&bytesRead,NULL);
И, наконец,CloseHandle (устройство), чтобы закрыть файл.
Это прекрасно работает в случае, когда функции вызываются из основного потока.Если они вызываются из какого-то другого потока, мы получаем ошибку 998 (no_acccess) при попытке записать более пары элементов.Потоки созданы с использованием
CreateThread(NULL, 0, thread_func, NULL, 0, &thread_id);
У меня заканчиваются идеи здесь, какие-либо предложения?
edit: при выполнении следующей последовательности:
Main_thread:
CreateFile
Write
Close
CreateThread
WaitForThread
Thread_B:
CreateFile
Write
Close
Main_Thread успешно выполняется, а Thread_B - нет.Однако при записи небольших наборов данных это работает нормально.Может ли это быть потому, что Thread_B не наследует все привилегии доступа Main_Thread?
edit2: здесь много хороших размышлений, высоко ценится!После некоторой работы над этой проблемой, похоже, имеет место следующее:
API содержит поток очереди, обрабатывающий все пакеты, поступающие на устройство и с него.Этот поток обрабатывает указатели на объекты пакета.Когда указатель достигает начала очереди, вызывается функция send_and_get.Если массивы в пакете расположены в том же потоке, который вызывает функцию send_and_get, все работает нормально.Если массивы размещены в каком-то другом потоке, отправка не удалась.Но как это исправить, я не знаю.