Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CreateFile ("\\\\.\\IDE21201.VXD&qu, INVALID_HANDLE_VALUE 
:(
    Опции темы
Antropoid
Дата 28.9.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



Пишу
Код

VxDHandle = CreateFile ("\\\\.\\IDE21201.VXD", 0, 0, 0,
                            0, FILE_FLAG_DELETE_ON_CLOSE, 0);

если файл IDE21201.VXD находится в папке, которая названа английскими буквами - все ОК,  если русскими - возвращает INVALID_HANDLE_VALUE. В чем проблема?



--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Romikgy
Дата 29.9.2006, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



кодировка
но имхо 
Цитата(Antropoid @  28.9.2006,  16:20 Найти цитируемый пост)
reateFile ("\\\\.\\IDE21201.VXD"

это обращение не к файлу


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
sOckets
Дата 29.9.2006, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

Репутация: нет
Всего: 2



Код
VxDHandle = CreateFile ("\\\\.\\IDE21201.VXD", 0, 0, 0,0, FILE_FLAG_DELETE_ON_CLOSE, 0);

А почему ты не указываешь явный путь к файлу ?


--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
Antropoid
Дата 29.9.2006, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



Romikgy, а как установить правильную кодировку?

sOcketsявный - это какой? мне нужно использовать возможности, встроенные в IDE21201.VXD драйвер, он находится в том же месте, где и вызывающее его приложение; если по твоему надо так
Код

VxDHandle = CreateFile ("IDE21201.VXD", 0, 0, 0,0, FILE_FLAG_DELETE_ON_CLOSE, 0);

то так не катит - бросается INVALID_HANDLE_VALUE.

 smile 


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
sOckets
Дата 29.9.2006, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

Репутация: нет
Всего: 2



Код

#include <windows.h>
int main()
{
    HANDLE            VxDHandle;
    char            CurDir[1000];
    if (GetCurrentDirectory(sizeof(CurDir)-1,CurDir));
    {
        strcat(CurDir,"\\");
        strcat(CurDir,"IDE21201.VXD");
    }
    VxDHandle = CreateFile(CurDir,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL); 
    return 0;
}

Пойдёт ?

Добавлено @ 18:34 
Цитата
то так не катит - бросается INVALID_HANDLE_VALUE.

Используй GetLastError
geterrors.h
Код

void GET_ERROR()
{
        TCHAR szBuf[80]; 
         LPVOID lpMsgBuf;
    DWORD ERROR_DW = GetLastError(); 
    FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    ERROR_DW,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    (LPTSTR) &lpMsgBuf,
    0, NULL );
    wsprintf(szBuf,"Ошибка %d: %s",ERROR_DW, lpMsgBuf); 
    MessageBox(NULL, szBuf, "Error", MB_OK);
}

Ложи его в include каталог компилятора , и просто просле каждой функции WinAPI где есть сомнения вызывай GET_ERROR() , я так делаю ,и мне удобно.

Добавлено @ 18:36 
Ой сорри , тебе же нужно его читать....сейчас переделаю.

Добавлено @ 18:37 
Код

#include <windows.h>
#include <geterrors.h>
int main()
{
    HANDLE            VxDHandle;
    char            CurDir[1000];
    if (GetCurrentDirectory(sizeof(CurDir)-1,CurDir));
    {
        strcat(CurDir,"\\");
        strcat(CurDir,"IDE21201.VXD");
    }
    VxDHandle = CreateFile(CurDir,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    GET_ERROR();
    return 0;
}


Работает без ошибок.


--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
Romikgy
Дата 29.9.2006, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



Antropoid
Цитата(Antropoid @  29.9.2006,  17:00 Найти цитируемый пост)
IDE21201.VXD

это драйвер? или это приложение?
если драйвер как ты его запускаешь и подкакой системой?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Antropoid
Дата 29.9.2006, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



sOckets, теперь ошибка не вылетает, но... почему-то не отрабатывают действия, возложенные на IDE21201.VXD,- дело в том, что после этого идет
Код

DeviceIoControl (VxDHandle, m_cVxDFunctionIdesDInfo,
            0, 0, pOutBufVxD, sizeof(pt_IdeDInfo), &lpBytesReturned, 0);

и если после написать
Код

GET_ERROR();

, то выскакивает "Ошибка 87: Параметр задан не верно", а DeviceIoControl возвращает 0, что говорит о его некорректной работе.
 smile

Добавлено @ 22:38 
Romikgy, это фиговина, предназначенная для считывания серийника HDD(не моя). А запускаю я ее из под Windows 98


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Romikgy
Дата 29.9.2006, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



Antropoid, если это драйвер 
Цитата(Antropoid @  29.9.2006,  21:33 Найти цитируемый пост)
для считывания серийника HDD

и плюс к этому
Цитата(Antropoid @  29.9.2006,  21:33 Найти цитируемый пост)
я ее из под Windows 98

то да будет те известно , что 98 не понимает динамической загрузки драйверов, его надо прописать/установить в системе и только тогда юзать 
Цитата(Antropoid @  28.9.2006,  16:20 Найти цитируемый пост)
VxDHandle = CreateFile ("\\\\.\\IDE21201.VXD", 0, 0, 0,
                            0, FILE_FLAG_DELETE_ON_CLOSE, 0);

потому как открывание драйвера идет через другую стезю!

имхо под 98 можно напрямую в порты свистеть, так что имхо перестань мучится с драйверами под 98, и посмотри как тоже можно сделать через порты ввода/вывода

ЗЫ и в дальнейшем указывай под какой системой работаешь и что надо сделать , а то советуют те , а смысла в этих советах ноль!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Antropoid
Дата 29.9.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



Цитата(Romikgy @  29.9.2006,  22:53 Найти цитируемый пост)
98 не понимает динамической загрузки драйверов

все прекрасно работает под Виндовс 98, если файл
Цитата(Antropoid @  28.9.2006,  17:20 Найти цитируемый пост)
IDE21201.VXD находится в папке, которая названа английскими буквами

если русскими - возвращаетINVALID_HANDLE_VALUE!
 smile 



--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Romikgy
Дата 29.9.2006, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



Цитата(Antropoid @  29.9.2006,  22:31 Найти цитируемый пост)
все прекрасно работает под Виндовс 98, если файл

это не корректно имхо
ты в НТ грузил драйвера? динамически , так вот там сначало его надо в систему загрузить ! а в 98 думаешь по другому? может я и ошибаюсь , но ты видать не для себя это пишешь и неизвестно как этот код прореагирует на другой машине, даже с англ. папками

Это сообщение отредактировал(а) Romikgy - 29.9.2006, 23:36


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Antropoid
Дата 29.9.2006, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



Цитата(Romikgy @  29.9.2006,  23:33 Найти цитируемый пост)
ты видать не для себя

само собой   smile 
Цитата(Romikgy @  29.9.2006,  23:33 Найти цитируемый пост)
неизвестно как этот код прореагирует на другой машине

этот код тестировался на 5 машинах под Виндовс 98,- все ОК.
Единственная проблема - русские буквы
 smile 


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Damarus
Дата 30.9.2006, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 4
Всего: 29



Romikgy, почитай: VXD. Урок 1. Основы

Цитата(Antropoid @  29.9.2006,  23:33 Найти цитируемый пост)
почему-то не отрабатывают действия, возложенные на IDE21201.VXD,- дело в том, что после этого идет

Просто код, который написал sOckets, открывает IDE21201.VXD как обычный файл, а не как VXD. ИМХО твой код правильный.

Добавлено @ 01:40 
Цитата
Динамические VxD могут быть загpужены следующим обpазом:

  • Помещением их в папку \SYSTEM\IOSUBSYS в диpектоpии Windows. VxD в этой диpектоии загpужаются Input Output Supervisor'ом (IOS). VxD в этой папке должны поддеpживать layer device driver'а, поэтому, возможно, это не самая лучшая идея загpужать ваш VxD этим путем.
  • Используя сеpвис VxD-загpузчика. VxD-загpузчик - это статический VxD, котоpый может динамически загpужать VxD. Вы можете вызывать его сеpвисы из дpугих VxD или из 16-битного кода. 
  • Используя CreateFile API из Win32-пpиложения. Вы указываете динамический VxD, котоpый вы хотите загpузить в следующем фоpмате: 

               \\.\pathname

    Hапpимеp, если вы хотите загpузить динамический VxD под названием FirstVxD, котоpый находится в текущей диpектоpии, вам следует указать следующий путь:
    Код

    .data VxDName db "\\.\FirstVxD.VXD",0
    ...... 
    .data?
    hDevice dd ?
    .....
    .code 
    ..... 
    invoke CreateFile, addr VxDName,0,0,0,0, FILE_FLAG_DELETE_ON_CLOSE,0 
    mov hDevice,eax 
    ...... 
    invoke CloseHandle,hDevice 
    ...... 

FILE_FLAG_DELETE_ON_CLOSE - флаг, указывающий, что VxD выгpужается, когда хэндл, возвpащенный CreateFile, будет закpыт. 

Если вы используете CreateFile, чтобы загpузить динамический VxD, VxD должен поддеpживать сообщение w32_DeviceIoControl. VWIN32 посылает это контpольное сообщение вашему динамическому VxD, когда он загpужается в пеpвый pаз чеpез CreateFile. VxD должен возвpатить 0 в eax'а в качестве ответа на это сообщение.


Это сообщение отредактировал(а) Damarus - 30.9.2006, 01:55
PM MAIL ICQ Jabber   Вверх
sOckets
Дата 30.9.2006, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

Репутация: нет
Всего: 2



Я откуда знал что ему нужно по другому открывать smile
Есть решение , попробуй просто скопировать этот файл в папку с windows и открывать от-туда .


--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
Antropoid
Дата 30.9.2006, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



Цитата(sOckets @  30.9.2006,  11:19 Найти цитируемый пост)
 скопировать этот файл в папку с windows

моя программа не должна вносить никаких изменений в ОС(к тому же Windows-англ.слово и все прокатит). Мне с кодировками разобраться... smile 


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
sOckets
Дата 30.9.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

Репутация: нет
Всего: 2



Ошибка может быть в чём угодно , может быть функция CreateFile в Windows 98 не правильно работает с UNICODE , например вырезка из книги Рихтера :
Цитата
А еще лучше, если Microsoft исправит функцию CreateProcess, чтобы та не морочила нам голову. Надеюсь, в следующей версии Windows так и будет. 

тут конечно про CreateProcess , но какая разница ? один программист в Microsoft допустил ошибку , теперь все программисты страдают .
Например (с той же книги):
Цитата
Увы, программист, писавший ее код, слегка ошибся, и получилось так, что номера версии Windows поменялись местами: в старший байт попадал дополнительный номер, а в младший — основной. Поскольку многие программисты уже начали пользоваться этой функцией, Microsoft пришлось оставить все, как есть, и изменить документацию с учетом ошибки.


Поэтому скорее всего что функция CreateFile в Windows98 работает совсем подругоме нежели в NTшых.

Добавлено @ 16:18 
Цитата
Romikgy, это фиговина, предназначенная для считывания серийника HDD(не моя). А запускаю я ее из под Windows 98


Не факт что "фиговина" правльно работает.


--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
Antropoid
Дата 30.9.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



Цитата(sOckets @  30.9.2006,  16:14 Найти цитируемый пост)
дин программист в Microsoft допустил ошибку , теперь все программисты страдают 


т.е. проблему решить не возможно? smile 



--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
sOckets
Дата 30.9.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

Репутация: нет
Всего: 2



Попробуй так :
Код

   DWORD cb; 
   preg->reg_Flags = 0x8000;
   VxDHandle = CreateFile(CurDir,GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,(LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING,   FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); 
   DeviceIoControl(VxDHandle, m_cVxDFunctionIdesDInfo,preg, sizeof(*preg), preg, sizeof(*preg), &cb, 0); 




--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
dumb
Дата 30.9.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Antropoid, а ты пробовал раскомментировать кусок кода после строки
Код

       //  must use the short file name path to open a VXD file

и использовать его вместо одной строчки CreateFile?

и даже если так не выйдет - создать какой-нибудь c:\123jklsgbnmn134\, скопировать туда vxd и открыть оттуда. потом стереть.
PM MAIL   Вверх
sOckets
Дата 30.9.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

Репутация: нет
Всего: 2



Цитата
Windows Me/98/95:  DeviceIoControl can only accept a handle to a virtual device driver. For example, to open a handle to the system VxD with CreateFile, specify \\.\vwin32. 

Вот так 


--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
Antropoid
Дата 30.9.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



Цитата(sOckets @  30.9.2006,  16:25 Найти цитируемый пост)
Попробуй так : ...

так тоже не катит,- DeviceIoControl возвращает 0, а GET_ERROR(); пишет
"Ошибка 87: Параметр задан не верно"


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
SergeCpp
Дата 30.9.2006, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 10
Всего: 124



Весьма вероятно, что причина — в коде загрузки драйвера

Проверьте, всё ли там корректно с точки зрения путей, имён файлов etc

Или приведите код (часть кода) здесь

P.S. Загрузку VxD можно отлаживать... Вы в курсе? Отладчик TRW2000 — проще и чем-то лучше (да-да, почитайте в сети...) чем SoftIce

PM MAIL WWW ICQ   Вверх
Antropoid
Дата 30.9.2006, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



SergeCpp, ну, если это поможет, то пожалуйста
Код

    TITLE DSIdeInf.asm - VxD retrieves information from IDEs


       ;  created using a modified version of DSIdeInf.asm from
       ;  http://skyscraper.fortunecity.com/virtuosity/452/


       ;  modified by Scott Kell from DSIdeInf.asm in Jan 2001
       ;  bug fixed by Grzegorz Lapinski in May 2002

    
    .386P
    
    .NOLIST
      Include Vmm.inc
      Include VWin32.inc
      Include Shell.inc
    .LIST
    
    ; *****  EQUATES  *****
    
      ; --- Bits ---
      cBit00 EQU 0000000000000001b
      cBit02 EQU 0000000000000100b
      cBit06 EQU 0000000001000000b
      cBit07 EQU 0000000010000000b
    
      ; --- Tests ---
      cERR   EQU cBit00
      cBusy  EQU cBit07
    
      ; --- Area offsets in buffer ---
      cDisk0_Exists = 4
      cDisk0_RawInfo =12
    
      ; --- GDI commands ---
      cATA_GDIcmd    EQU 0ECh    ; GDI command for ATA
      cATAPI_GDIcmd  EQU 0A1h    ; GDI command for ATAPI
    
    
    ; ****  MACROS  *****
    
    ; wPort0 has to be initialized according to IDE
    WaitWhileBusy MACRO
      LOCAL LoopWhileBusy
      LOCAL timeout
      LOCAL TryAgain
      LOCAL DriveReady

        PUSH  EBX
        TryAgain:
          ;  1000000 is too long !
        MOV   EBX, 100000
    
        MOV   DX, [wPort0]
        ADD   DX, 7           ; DX = Port0 +7
    
      LoopWhileBusy:
        DEC   EBX
        CMP   EBX, 0
        JZ  timeout
        IN    AL, DX
        TEST  AL, cBusy
        JNZ LoopWhileBusy

        POP EBX
        JMP DriveReady

      timeout:
        POP EBX
        JMP Next_Mos

        DriveReady:
    
    ENDM  ; (WaitWhileBusy)

    ; wPort0 has to be initialized according to IDE
    ; bDevSelCmd has to be initialized according to MoS
    SelectDevice MACRO
        MOV   DX, [wPort0]
        ADD   DX, 6                 ; DX = Port0 +6
        MOV   AL, [bDevSelCmd]      ; AL = DevSelCmd
    
        OUT   DX, AL

    ENDM  ; (SelectDevice)
    
    ; wPort0 has to be initialized according to IDE
    ; Parameter 'GDIcmd' is GDI command (ATA or ATAPI)
    SendGDIcmd MACRO GDIcmd
        MOV   DX, [wPort0]
        ADD   DX, 7                 ; DX = Port0 +7
        MOV   AL, GDIcmd
    
        OUT   DX, AL
    ENDM  ; (SendGDIcmd)
    
    
    ; -------------------------------
    ; --- Device Descriptor Block ---
    ; -------------------------------
    
    DECLARE_VIRTUAL_DEVICE \
      IDE21201, 1, 0, IDE21201_Control,\
      UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER
    
    
    ; ----------------------------------------
    ; --- Prepare Device Control Procedure ---
    ; ----------------------------------------
    
    Begin_control_dispatch IDE21201
      Control_Dispatch w32_DeviceIoControl, On_DeviceIoControl
    End_control_dispatch IDE21201
    
    ; ************
    ; **  CODE  **
    ; ************
    
    VxD_LOCKED_CODE_SEG
    
      ; === DEVICE CONTROL PROCEDURE ===
    
      BeginProc On_DeviceIoControl
        ASSUME ESI:PTR DIOCParams
    
        .if [esi].dwIoControlCode==DIOC_Open
    
          xor eax,eax
    
        .elseif [esi].dwIoControlCode==1
    
          CALL IdesInfo
          xor eax, eax
    
        .endif
    
        RET
      EndProc On_DeviceIoControl
    
      ; Meaning of registers:
      ;   ESI: pointer to output buffer
      ;   EDI: pointer to section of 1 disk info, in output buffer
      ;   EBX: IDE (0..3)
      ;   ECX: MasterOrSlave (0..1)
    
      ;  IDE controllers:
      ;   Range: 0..3
      ;   Address of IdeExists(n) byte in output buffer
      ;     = ESI + Ide = ESI + EBX
    
      ; DISCs:
      ;   Range: 0..7
      ;   Disk = Ide*2 + MoS = EBX*2 + ECX
      ;   Address of DiskExists(n) byte in output buffer
      ;     = ESI + cDisk0_Exists + Disk
      ;   Address of Disc raw info first byte in output buffer
      ;     = ESI + cDisk0_RawInfo + Disk*512
    
      BeginProc IdesInfo
        ASSUME ESI:PTR DIOCParams
    
        ; --- Preserve registers and flags ---
    
          PUSHAD
          PUSHFD

          CLI   ;  clear all interrupts

    
        ; --- Initialize ESI as pointer to output buffer ---
    
          MOV   ESI, [ESI.lpvOutBuffer]
    
        ; --------------------------------------
        ; --- Process to get the information ---
        ; --------------------------------------
    
          ; Initialize FOR_Ide counter
                   ;  test all 4 IDE controllers
          MOV   EBX, 3            ; EBX = Ide no 3
                   ;  test the first 2 IDE controllers
;          MOV   EBX, 1            ; EBX = Ide no 3
                   ;  only test the primary IDE controller
;          MOV   EBX, 0            ; EBX = Ide no 3
    
        FOR_Ide:                  ; FOR EBX=3 DOWNTO 0
    
        ; --- Initialize wPort0 for this IDE ---
    
          MOV   DX, [wPorts_table + EBX*2]
          MOV   wPort0, DX
    
        ; --- Check if IDE exists ---
    
          ;MOV    DX, [wPort0]
          ADD   DX, 7                 ; DX = Port0 +7
    
          IN    AL, DX
    
        ;Test0FFh
          CMP    AL, 0FFh
          JNE    Test07Fh
          JMP   NEXT_Ide              ; If AL = 0FFh, IDE not present
                                      ;   -> NEXT_Ide
    
        Test07Fh:
          CMP   AL, 07Fh
          JNE   IdeExists
          JMP   NEXT_Ide              ; If AL = 07Fh, IDE not present
                                      ;   -> NEXT_Ide
    
        IdeExists:
    
        ; --- Set value at the IdeExists area in output buffer ---
    
          MOV   BYTE PTR [ESI + EBX], 1     ; Ide_Exists = True
    
        ; --- Prepare MoS (Master or Slave) loop ---
    
          ; Initialize FOR_MoS counter
          MOV   ECX, 1                ; ECX = Slave
    
        FOR_MoS:                      ; FOR MoS=1 DOWNTO 0
    
        ; --- Get bDevSelCmd for this disc ---
    
          MOV   DL, [bDevSelCmd_table + ECX]      ; DL = DevSelCmd
          MOV   bDevSelCmd, DL
    
        ; --- Check if Disc exists ---
    
          WaitWhileBusy
          SelectDevice
          WaitWhileBusy
    
          TEST  AL, cBit06          ; check the drive ready bit
          JNZ   DiskExists
          JMP   NEXT_MoS            ; if drive ready bit not set then next MoS
    
        DiskExists:
    
        ; Compute Disk (= Ide*2 + MoS = EBX*2 + ECX)
    
          MOV   EAX, EBX        ; EAX = Ide
          SHL   EAX, 1          ; EAX = Ide*2
          ADD   EAX, ECX        ; EAX = Disk
    
        ; --- Prepare EDI as pointer
        ; to the area where info is to be stored --
    
        ; Compute Disk*512 (knowing that 512 = 2 ^9)
    
          XCHG  AH, AL      ; Was: AL = Disk , Now: AH = Disk
                            ;   -> EAX = Disk* 2^8
          SHL   EAX, 1      ; EAX = Disk* 2^9
    
          MOV   EDI, ESI              ; EDI = @Output buffer
          ADD   EDI, cDisk0_RawInfo   ; EDI = @beginning of raw info area in output buffer
          ADD   EDI, EAX              ; EDI = @raw info section for this Disc
    
        ; ----------------- Retrieve ---------
    
          WaitWhileBusy
          SelectDevice
          SendGDIcmd cATA_GDIcmd
          WaitWhileBusy
    
          ; check error status
          MOV   DX, [wPort0]
          ADD   DX, 7                 ; DX = Port0 +7
    
          IN    AL, DX
    
          TEST  AL, cBit00
          JZ    RetrieveInfo          ; if no error then retrieve info
    
          ; ERR=1 -> try ATAPI GDI command
          WaitWhileBusy
          SelectDevice
          SendGDIcmd cATAPI_GDIcmd
          WaitWhileBusy
    
          ; check error status
          MOV   DX, [wPort0]
          ADD   DX, 7                 ; DX = Port0 +7
    
          IN    AL, DX
    
          TEST  AL, cBit00
          JZ    RetrieveInfo          ; if no error then retrieve info
          JMP   NEXT_Mos
    
        RetrieveInfo:
          PUSH  ECX                   ; keep MoS value
    
          MOV   ECX, 256
          MOV   DX, [wPort0]
          CLD
    
          REP   INSW                  ; Retrieve (finally!)
    
          POP ECX                     ; restore MoS value
    
        ; if we've made it this far then we know we have a valid disk
        ; Compute Disk (= Ide*2 + MoS = EBX*2 + ECX)
    
          MOV   EAX, EBX        ; EAX = Ide
          SHL   EAX, 1          ; EAX = Ide*2
          ADD   EAX, ECX        ; EAX = Disk
    
        ; --- Set value at the DiscExists area in output buffer ---
          MOV   BYTE PTR [ESI + cDisk0_Exists + EAX], 1 ; Disk_Exists = True
    
        NEXT_Mos:
    
          ;LOOP FOR_MoS
          CMP   ECX, 0
          JE    NEXT_Ide
          DEC   ECX
          JMP   FOR_MoS
    
        NEXT_Ide:
          ;LOOP FOR_Ide
          CMP   EBX, 0
          JE    Exit_IdeLoop
          DEC   EBX
          JMP   FOR_Ide
    
        Exit_IdeLoop:
    
        ; --- Restore flags and registers ---

          STI   ; restart the interrupts
    
          POPFD
          POPAD
    
          RET
      EndProc IdesInfo
    
    VxD_LOCKED_CODE_ENDS
    
    ; ************
    ; **  DATA  **
    ; ************
    
    VxD_LOCKED_DATA_SEG
    
      ; --- Tables ---
      wPorts_table      WORD  1F0h, 170h, 1E8h, 168h  ; IDE 1 - 4
      bDevSelCmd_table  BYTE  0A0h, 0B0h              ; Master - Slave
    
      ; --- Variables ---
      wPort0            WORD  ?   ; Port 0
      bDevSelCmd        BYTE  ?
    
    VxD_LOCKED_DATA_ENDS
    
    END


Это сообщение отредактировал(а) Fixin - 2.10.2006, 09:28


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Romikgy
Дата 30.9.2006, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



Antropoid, если у тя есть исходник драйвера, ты что не можешь для 98 заделать это без драйвера?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Antropoid
Дата 30.9.2006, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



Romikgy, не могу smile 


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Romikgy
Дата 30.9.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



религия не позволяет?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Antropoid
Дата 1.10.2006, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: нет
Всего: 16



Romikgy, знания...


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1776 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.