· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› Драйвер под Windows для самопальной железки (вопро

Посл.отвђт Сообщенiе


Дата: Дек 5, 2002 05:47:26

Необходимо сделать драйвера под все ОС семейства Windows для своего железа (ISA-карта - сторожевой таймер), в программировании на Асме под Винды полный нуль (в ДОСе в основном), поэтому взял книгу - Язык ассемблера: уроки программирования Рудакова и Финогенова. Скачал Win98 DDK, пропатчил MASM до 6.14, пробую скомпилить пример из книги, заваливается на линкере с ошибкой :
fatal error LNK1190: invalid fixup found, type 0x0001, вопрос в какую сторону копать???? В Инете про нее пишут, типа был изменен OBJ файл, перекомпилите еще раз, пробовал результат нулевой.

Железку сочинил, изготовили партию, все воркает, а драйвера написать некому, приходиться самому париться. Если интересно глядеть www.openhardware.ru -> WatchDog Timer. Уже после постинга сюда пробовал разобраться, выходит следующее, если при линковке, использовать все ключи описаные в файле vmyd.lnk, то получаю VxD без проблем, если в коммандной строке указать файл vmyd.def, то даже при отсутствии в нем инфы, получаю такую же ошибку. Знаю что ошибка ламерская, а понять куды копать не могу.


Дата: Дек 6, 2002 09:40:25

С компиляцией разобрался, нуно было ставить нужные ключи к линкеру.
Появился новый вопрос, как узнать в какой каталог по умолчанию поставлена Винда??? Есть ли какой-нить стандартный макрос/функция для этого?? Надо для чтения VxD-шником конфигурации из файла, который будет лежать в %WinDir%\


Дата: Дек 6, 2002 10:47:32 · Поправил: Aquila

GetWindowsDirectory


Дата: Дек 6, 2002 17:14:39

2Aquila: спасибо, буду пробовать.


Дата: Дек 14, 2002 17:11:40

Для написания драйвера использую VmWare 3.2 под ASPLinuxом 7.3, в Варьке крутиться Windows 98SE, нашел интересный или глюк или фичу.
В процессе загрузки VxDшника, когда он инициализируется (Device_Init), в цикле перебором портов ввода-вывода ищу свое устройство, использование in/out в этом месте рушит VmWare полностью, процесс сдыхает с диким криком. Может кому пригодиться.

Попутно вопрос, так вообще можно делать?? Для примера кусок кода:


v_ok_go4:
mov AL,05h
inc DX
inc DX
; out DX,AL ; Рушит VmWare3.2 напрочь
dec DX
dec DX
; in AL,DX
cmp AL,0h
skip


Дата: Дек 15, 2002 16:35:26

Как повеситься на WM_TIMER для периодического обращения к своей железке?? Есть ли другие способы??


Дата: Янв 3, 2003 03:54:28

Аноним
Thread создавать не пробовали ?


Дата: Янв 3, 2003 03:58:01

Аноним
Создаещ поток с приоритетом каким хочещ(Надо)
и он с твоей железкой "автономно работает"


Дата: Янв 3, 2003 04:01:15

Я к стати в Win98 просто "out ..."
писал и ничего прокатывало.
теперь надо под 2000 не прокатит.


Дата: Янв 3, 2003 17:03:46

Поток создавать через VMMCreateThread попробовал, но не получилось, рушит Винды, посоветовали использовать другую функцию, если есть рабочий пример создания или ссылка где почитать, бросьте плиз.


Дата: Янв 3, 2003 19:24:02

VMMCreateThread
VMMCall VMMCreateThread, <initial_ss, initial_esp, initial_cs,
initial_eip, initial_ds, initial_es, ThreadType, InitCallback,
RefData>
or eax, eax
jz thread_not_created

Creates a protected mode thread in the system virtual machine and starts it executing in ring 3 at the instruction specified by CS:EIP. Uses all registers and Flags.
//------------------------------------------------------

include vmm.inc

mov edi, ThreadHandle
mov eax, Create_Thread
VMMCall System_Control

//------------------------------------------------------
// Thread_Init

include vmm.inc

mov edi, ThreadHandle
mov eax, Thread_Init
VMMCall System_Control

//------------------------------------------------------
// Destroy_Thread
include vmm.inc

mov edi, ThreadHandle
mov eax, Destroy_Thread
VMMCall System_Control


Смотрел MSDN ?


Дата: Янв 4, 2003 13:28:10

Вот мой фрагмент, выдрал из примера (его можно найти поиском VMMCreateThread на ya.ru)

push eax ; random sh!t
push offset WDT_Callback ; address of callback routine
push 'WDT' ; ID
push 187h ; ES register
push 187h ; DS register
push offset WDT_Thread_Counter_Clear ; EIP - address of Thread proc
push 17fh ; CS register
push offset tstack ; ESP - address of Thread stack
push 187h ; SS register
VxDCall VMMCreateThread ; create thread!
add esp, 24h ; clean stack
test EAX, EAX ; thread successfuly created?
je thread_install_fail

В WDT_Callback

BeginProc WDT_Callback
clc
ret
EndProc WDT_Callback

Общая ошибка защиты, где-то я проперся. MSDN естественно смотрел, думал, но поймал траблы.


Дата: Янв 4, 2003 23:30:15

CWinThread *pThread;
UINT modeling_in_progress;

CMainFrame::CMainFrame()
{
pThread=NULL;
modeling_in_progress=0;
}

void CMainFrame::OnButtonMod()
{

if(!pThread){
pThread = AfxBeginThread(ThreadFunc,GetActiveView(),
THREAD_PRIORITY_NORMA L
/*THREAD_PRIORITY_BELOW_NORMAL*/
/*THREAD_PRIORITY_ABOVE_NOR MAL*/
/*THREAD_PRIORITY_HIGHEST*/);
pThread->m_bAutoDelete = FALSE;
modeling_in_progress=1;
}else{
DWORD exitcode;
if(pThread){
g_Exit.SetEvent();
do GetExitCodeThread(pThread->m_hThread,
&exitcode);
while(exitcode == STILL_ACTIVE);
delete(pThread);
pThread=NULL;
modeling_in_progress=0;
}
}


}


UINT ThreadFunc(LPVOID lpv){

DWORD ms_cur ,ms_end;
ms_end = 0;

while(true){
ms_cur = GetTickCount();
//--------------------------------
// if(WaitForSingleObject(g_Exit,0)==WAIT_OBJECT_0){
// return 1;
// }
//--------------------------------
if(ms_end<=ms_cur){
ms_end = GetTickCount()+200;
var_ms++;
//================================================================//
// öèêë 200 ms
// var_ms = 5 ïðîøëà 1 sek
//================================================================//

Çäåñü îáðîùàåøúñÿ ê ñâîåé æåëåçêå

//--------------------------------
}
return 0;
}


Åñëå íóæíî áîëåå òî÷íî òî ÷åðåç MMTimer.


Дата: Янв 6, 2003 13:45:48

Насколько я понял из вашего примера, это программа на С, которая создает нить для для выполнения определенных действий. Немного не подходит, поскольку все надо сделать в виде VxD на Асме.


Дата: Фев 15, 2003 02:34:19

-Господа хорошие, осчасливте ссылкой,
где слить ДДК для винды 98-ой можна,
-ибо на Микрософте хрен, извиняюсь
а не ДДК, -слиcя весь... :(

-А насчёт сторожевиков так их я думаю,
и в самом железе предостаточно, и насколько
мне известно ХР с этим делом управляется,
-мой знакомый как-то исхитряется холодный
ребут через видяху,устраивать там если какой-то
таймер хитро запустить и не ресэтить своевременно,
то -упс... ай дид ит аген... -винда падает,
правда потом постит какой-то мессадж с предЪявами
к видеодрайверу -мол не успел рефреш сделать...
-так-что под PCI может и делать ничаго ненадо будет :))
dovebox@yandex.ru


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.098