мм.. извиняюсь, если уже было, я что-то не нашел.. в общем, вот: Код (Text): UNICODE_STRING str; ObjectAttributes.Length= sizeof(ObjectAttributes); ObjectAttributes.Attributes= OBJ_CASE_INSENSITIVE; ObjectAttributes.RootDirectory= NULL; ObjectAttributes.SecurityDescriptor= NULL; ObjectAttributes.SecurityQualityOfService= NULL; ObjectAttributes.ObjectName= &str; HANDLE hKeyboard; IO_STATUS_BLOCK IoStatusBlock; RtlInitUnicodeString(ObjectAttributes.ObjectName, L"\\Device\\KeyboardClass0"); NtOpenFile(&hKeyboard, GENERIC_READ | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_DIRECTORY_FILE); char Buffer[0x10000]; LARGE_INTEGER r= {0}; NtReadFile(hKeyboard, NULL, NULL, NULL, &IoStatusBlock, Buffer, 0x10000, &r, NULL); NtOpenFile возвращает STATUS_SUCCESS, все поля IoStatusBlock заполняются нулями NtReadFile возвращает 0xC0000023 (STATUS_BUFFER_TOO_SMALL), IoStatusBlock не меняется почему чтение возвращает ошибку? размер буфера 64k
Код (Text): NTSTATUS KeyboardClassRead( IN PDEVICE_OBJECT Device, IN PIRP Irp ) { . . . } else if (irpSp->Parameters.Read.Length % sizeof(KEYBOARD_INPUT_DATA)) { status = STATUS_BUFFER_TOO_SMALL; . . . }