среда, 9 сентября 2020 г.

Как можно заклинить виртуальный картридер?

Это перевод How is it possible to jam a virtual card reader? Автор: Реймонд Чен.

Когда-то давно я поддерживал систему с разделением времени, известную как VM/CMS. Каждый пользователь, вошедший в систему, получал свою собственную виртуальную машину с виртуальными аппаратными устройствами: виртуальным устройством для чтения карт, виртуальным устройством для записи перфокарт и виртуальным принтером.

Хорошо, у вас есть виртуальный картридер. Как вы будете загружать виртуальные карты в свой виртуальный картридер? И зачем вообще это делать?

среда, 2 сентября 2020 г.

Чему может быть равно свойство Status у WMI класса Win32_ComputerSystem?

Это перевод What are the possible Status values for Win32_ComputerSystem? Автор: Реймонд Чен.

Документация для WMI класса Win32_Computer­System содержит такое описание свойства Status:
Status
Тип данных: string
Доступ: только чтение
Квалификаторы: MaxLen (10), DisplayName (“Status”)

Текущее состояние объекта. Могут быть определены различные рабочие и нерабочие состояния. К рабочим статусам относятся: OK, Degraded и Pred Fail. Последнее значение может использоваться, к примеру, жёстким диском с поддержкой SMART, который может функционировать правильно, но прогнозирует сбой в ближайшем будущем. К нерабочим состояниям относятся: Error, Starting, Stopping и Service, которые могут применяться во время переноса зеркала диска, перезагрузки списка разрешений пользователей или другой административной работы.

Это свойство наследуется от CIM_Managed­System­Element.

Значения могут быть следующими:
OK (“OK”)
Error (“Error”)
Degraded (“Degraded”)
Unknown (“Unknown”)
Pred Fail (“Pred Fail”)
Starting (“Starting”)
Stopping (“Stopping”)
Service (“Service”)
Stressed (“Stressed”)
NonRecover (“NonRecover”)
No Contact (“No Contact”)
Lost Comm (“Lost Comm”)
Что эта чушь пытается нам сказать? И что она говорит нам о возможных значениях свойства Status для Win32_Computer­System?

понедельник, 31 августа 2020 г.

Существует ли кодовая страница, совпадающая с ASCII и позволяющая сделать двустороннюю конвертацию в Unicode?

Это перевод Is there a code page that matches ASCII and can round trip arbitrary bytes through Unicode? Автор: Реймонд Чен.

Вам может понадобится такая кодовая страница, если у вас есть фрагмент двоичных данных с внедрённым текстом ASCII. Вы бы хотели иметь возможность извлекать текст ASCII и даже манипулировать им, но при этом и также обрабатывать части, не относящиеся к ASCII, как загадочные символы, не имеющие смысла. Но вам также нужно иметь возможность преобразовать их обратно в исходные байты.

пятница, 21 августа 2020 г.

Об использовании FILE_FLAG_WRITE_THROUGH и FILE_FLAG_NO_BUFFERING для проецируемых в память файлов

Это перевод On using FILE_FLAG_WRITE_THROUGH and FILE_FLAG_NO_BUFFERING for memory-mapped files. Автор: Реймонд Чен.

Клиент хотел использовать флаги FILE_FLAG_WRITE_THROUGH и FILE_FLAG_NO_BUFFERING для проецируемого в память файла (memory-mapped file), основываясь на этом руководстве в документации для функции CreateFile:
По этой причине флаг FILE_FLAG_WRITE_THROUGH часто используется совместно с флагом FILE_FLAG_NO_BUFFERING в качестве замены для вызова функции FlushFileBuffers после каждой записи, что может привести к ненужным потерям производительности. Совместное использование этих флагов позволяет избежать штрафов.
Клиент был обеспокоен тем, повлияет ли такая комбинация флагов на согласованность данных.

суббота, 23 мая 2020 г.

Отладка зависания: все потоки встали на WinHttpGetProxyForUrl

Это перевод Diagnosing a hang: Everybody stuck in WinHttpGetProxyForUrl. Автор: Реймонд Чен.

Клиент сообщил, что их программа рано или поздно полностью встаёт, а все её потоки (750 штук) зависают при вызове WinHttpGetProxyForUrl со следующим стеком вызова:
ntdll!ZwWaitForSingleObject+0x14
KERNELBASE!WaitForSingleObjectEx+0x8f
winhttp!OutProcGetProxyForUrl+0x160
winhttp!WinHttpGetProxyForUrl+0x349
contoso!submit_web_request+0x232
ntdll!TppWorkpExecuteCallback+0x35e
ntdll!TppWorkerThread+0x474
kernel32!BaseThreadInitThunk+0x14
ntdll!RtlUserThreadStart+0x21
(я упростил стек вызова для простоты объяснения)

Дело о SHGetFolderPath(CSIDL_COMMON_DOCUMENTS), возвращающей ERROR_PATH_NOT_FOUND

Это перевод The case of the SHGetFolderPath(CSIDL_COMMON_DOCUMENTS) that returned ERROR_PATH_NOT_FOUND. Автор: Реймонд Чен.

У клиента возникла проблема с функцией SHGetFolderPath. В частности, у них была программа, которая вызывала функцию так:
SHGetFolderPath(0, CSIDL_COMMON_DOCUMENTS, 0, SHGFP_TYPE_CURRENT, PChar(pathBuffer));
но вызов функции возвращал ошибку $80070003 - это HRESULT-версия для ERROR_PATH_NOT_FOUND. Ошибка возникает только при запуске из Jenkins pipeline. Если же программа запускается автономно, то функция завершается успешно и возвращает ожидаемый результат.

среда, 11 марта 2020 г.

Печальная, но короткая история значения реестра SM_AccessoriesName

Это перевод The sad but short story of the SM_AccessoriesName registry value. Автор: Реймонд Чен.

SM_AccessoriesName - ещё одна жертва программ, влезающих в недокументированные разделы реестра.

Однажды генеральный директор компании пожаловался в Конгресс на расширения файлов Windows

Это перевод That time the CEO of a company complained to Congress about Windows file extensions. Автор: Реймонд Чен.

В те времена, когда ненавидеть Microsoft было ещё более модно, чем сегодня (да, некоторые вещи никогда не выходят из моды), я помню, как генеральный директор одной технологической компании свидетельствовал перед Конгрессом, чтобы пожаловаться на файловые расширения Windows.

вторник, 25 февраля 2020 г.

Почему существуют тривиальные функции типа CopyRect и EqualRect?

Это перевод Why are there trivial functions like Copy­Rect and Equal­Rect? Автор: Реймонд Чен.

Если вы покопаетесь внутри user32, вы увидите там некоторые, казалось бы, тривиальные функции - такие как CopyRect и EqualRect. Зачем нам вообще нужны целые функции для того, что можно сделать с помощью операторов := и =?

Один байт = один доллар

Это перевод One byte used to cost a dollar. Автор: Реймонд Чен.

В те времена, когда программное обеспечение распространялось на дискетах (помните дискеты?), для Windows было правило: один байт стоит один доллар.