Пытался разобраться с GIVEIO. Написал нечто, что делает In/Out. Ессно без GIVEIO WinXP меня красиво посылает сообщением типа "недопустимая инструкция". А вот при попытке открыть GiveIO (он запущен и работает) выдает ошибку 1231. Файла winnt.h у меня нет, единственное средство посмотреть что это такое - FormatMessage. Но он выдает мне пустую строку. Не подскажете, что я сделал неправильно?
program Project1;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils;
function GetCursor: Integer;
asm
MOV DX, 3D4h
MOV AL, 0Fh
OUT DX, AL
INC DX
XOR EAX, EAX
IN AL, DX
end;
var
H: THandle;
E: Cardinal;
Msg: PAnsiChar;
begin
H := CreateFile('\\\\.\\GIVEIO', GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
E := GetLastError;
if H = INVALID_HANDLE_VALUE then
begin
if FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_ALLOCATE_BUFFER, nil, 0,
LANG_RUSSIAN, Msg, 0, nil) <> 0 then
Writeln ('ERROR_RESOURCE_LANG_NOT_FOUND');
Writeln ('Couldn''t access giveio device');
Writeln ('Error ', E, ': ', Msg);
Readln;
Halt;
end;
CloseHandle(H);
Writeln(GetCursor);
Readln;
end.
Добавлено
FormatMessage завершается корректно.
program Project1;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils;
function GetCursor: Integer;
asm
MOV DX, 3D4h
MOV AL, 0Fh
OUT DX, AL
INC DX
XOR EAX, EAX
IN AL, DX
end;
var
H: THandle;
E: Cardinal;
Msg: PAnsiChar;
begin
H := CreateFile('\\\\.\\GIVEIO', GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
E := GetLastError;
if H = INVALID_HANDLE_VALUE then
begin
if FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_ALLOCATE_BUFFER, nil, 0,
LANG_RUSSIAN, Msg, 0, nil) <> 0 then
Writeln ('ERROR_RESOURCE_LANG_NOT_FOUND');
Writeln ('Couldn''t access giveio device');
Writeln ('Error ', E, ': ', Msg);
Readln;
Halt;
end;
CloseHandle(H);
Writeln(GetCursor);
Readln;
end.
Добавлено
FormatMessage завершается корректно.