Hungry Mind , Blog about everything in IT - C#, Java, C++, .NET, Windows, WinAPI, ...

Показаны сообщения с ярлыком Windows. Показать все сообщения
Показаны сообщения с ярлыком Windows. Показать все сообщения

Windows Internals 7th edition

March 13, 2015

KiPageFault into BSOD when stepping over

I've been struggling long time with weird bug check during kernel driver debugging. Stack trace would look like this:

1: kd> k
Child-SP          RetAddr           Call Site
ffffd000`20463d78 fffff800`1aa610ea nt!DbgBreakPointWithStatus
ffffd000`20463d80 fffff800`1aa609fb nt!KiBugCheckDebugBreak+0x12
ffffd000`20463de0 fffff800`1a9d8da4 nt!KeBugCheck2+0x8ab
ffffd000`204644f0 fffff800`1aa00b1f nt!KeBugCheckEx+0x104
ffffd000`20464530 fffff800`1a8c75ad nt! ?? ::FNODOBFM::`string'+0x1797f
ffffd000`204645d0 fffff800`1a9e2f2f nt!MmAccessFault+0x7ed
ffffd000`20464710 fffff800`002b92e3 nt!KiPageFault+0x12f
ffffd000`204648a0 fffff800`0117b41f Wdf01000!imp_WdfFdoInitQueryProperty+0x28
ffffd000`204648f0 fffff800`0118117f MyVolFlt!WdfFdoInitQueryProperty+0x5f [c:\program files (x86)\windows kits\8.1\include\wdf\kmdf\1.13\wdffdo.h @ 217]
ffffd000`20464940 fffff800`0027f55b MyVolFlt!MyVolFltEvtDeviceAdd+0x9f [c:\development\projects\kernelmode\myvolflt\driver.c @ 116]
ffffd000`20464bd0 fffff800`1a9539d9 Wdf01000!FxDriver::AddDevice+0xab
ffffd000`20464ff0 fffff800`1ace18ab nt!PpvUtilCallAddDevice+0x35
ffffd000`20465030 fffff800`1acdff9e nt!PnpCallAddDevice+0x63
ffffd000`204650b0 fffff800`1acdf2db nt!PipCallDriverAddDevice+0x6e2
ffffd000`20465250 fffff800`1ad14b89 nt!PipProcessDevNodeTree+0x1cf
ffffd000`204654d0 fffff800`1a97d0b8 nt!PiProcessReenumeration+0x91
ffffd000`20465520 fffff800`1a97cf2e nt!PnpDeviceActionWorker+0x168
ffffd000`204655d0 fffff800`1af93382 nt!PnpRequestDeviceAction+0x1da
ffffd000`20465610 fffff800`1af89022 nt!IopInitializeBootDrivers+0x83e
ffffd000`204658b0 fffff800`1af7794d nt!IoInitSystem+0x91e
ffffd000`204659d0 fffff800`1ad7bd09 nt!Phase1InitializationDiscard+0xe61
ffffd000`20465bd0 fffff800`1a9182e4 nt!Phase1Initialization+0x9
ffffd000`20465c00 fffff800`1a9df2c6 nt!PspSystemThreadStartup+0x58
ffffd000`20465c60 00000000`00000000 nt!KiStartSystemThread+0x16

Bug Check description:

   1: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************
PAGE_FAULT_IN_NONPAGED_AREA (50)
Invalid system memory was referenced.  This cannot be protected by try-except,
it must be protected by a Probe.  Typically the address is just plain bad or it
is pointing at freed memory.
Arguments:
Arg1: ffffe00020464c10, memory referenced.
...

Now lets see what is this address:

1: kd> !pool ffffe00020464c10
Pool page ffffe00020464c10 region is Nonpaged pool
ffffe00020464000 is not a valid large pool allocation, checking large session pool...
Unable to read large session pool table (Session data is not present in mini and kernel-only dumps)
ffffe00020464000 is not valid pool. Checking for freed (or corrupt) pool
Address ffffe00020464000 could not be read. It may be a freed, invalid or paged out page
1: kd> ? poi(DeviceInit)
Evaluate expression: -35183830610928 = ffffe000`20464c10

Wow, faulting memory references is DeviceInit actually! And it is located on stack (because of KMDF model).

Sure IRQL is at PASSIVE level:

1: kd> !irql
Debugger saved IRQL for processor 0x1 -- 0 (LOW_LEVEL)

The funniest thing so far is that if I set bp after the call to WdfFdoInitQueryProperty - it would run smoothly. So there is something wrong with the debugger interacting OS kernel.

Now I finally managed to figure out what was wrong. I would normally set my bp during initial break-in sequence:

Connected to Windows 8 9600 x64 target at (Thu Jan 16 00:54:33.435 2014 (UTC + 2:00)), ptr64 TRUE
Kernel Debugger connection established.
************* Symbol Path validation summary **************
Response                         Time (ms)     Location
Deferred                                       cache*C:\Development\Tools\Symbols
Deferred                                       srv*http://msdl.microsoft.com/download/symbols
Symbol search path is: cache*C:\Development\Tools\Symbols;srv*http://msdl.microsoft.com/download/symbols
Executable search path is: 
Windows 8 Kernel Version 9600 MP (1 procs) Free x64
Built by: 9600.16452.amd64fre.winblue_gdr.131030-1505
Machine Name:
Kernel base = 0xfffff800`5547e000 PsLoadedModuleList = 0xfffff800`55742990
System Uptime: 0 days 0:00:00.102
nt!DebugService2+0x5:
fffff800`555d28e5 cc              int     3
kd> bp MyVolFltEvtDeviceAdd
kd> g

And here what happens after:

Unload module \SystemRoot\system32\mcupdate_GenuineIntel.dll at fffff800`1b200000
Unload module \SystemRoot\System32\drivers\werkernel.sys at fffff800`19ed5000
...
Unload module \SystemRoot\system32\DRIVERS\MyVolFlt.sys at fffff800`1b9ed000
nt!DebugService2+0x5:
fffff800`555d28e5 cc              int     3
kd> k
 # Child-SP          RetAddr           Call Site
00 fffff800`573991a8 fffff800`55544361 nt!DebugService2+0x5
01 fffff800`573991b0 fffff800`555442ff nt!DbgLoadImageSymbols+0x45
02 fffff800`57399200 fffff800`55b76fc4 nt!DbgLoadImageSymbolsUnicode+0x2b
03 fffff800`57399240 fffff800`55b7684b nt!MiReloadBootLoadedDrivers+0x300
04 fffff800`573993c0 fffff800`55b6c091 nt!MiInitializeDriverImages+0x163
05 fffff800`57399470 fffff800`55b67299 nt!MiInitSystem+0x3d9
06 fffff800`57399500 fffff800`557e84ea nt!InitBootProcessor+0x301
07 fffff800`57399740 fffff800`557de1a3 nt!KiInitializeKernel+0x5a2
08 fffff800`57399ad0 00000000`00000000 nt!KiSystemStartup+0x193

It is unloading boot time drivers! And reloading with different start addresses! So when I set my breakpoint at MyVolFltEvtDeviceAdd, WinDbg would insert int 3 instruction and during module relocation that instruction is copied as is. So my breakpoint actually hits, despite code relocation. But this is where the Windows and debugger fall apart - they don't know about this breakpoint.

In order to issue correct breakpoint address, you must break on module load:

kd> sxe ld MyVolFlt
kd> sxe ud MyVolFlt
kd> sx
  ct - Create thread - ignore
  et - Exit thread - ignore
 cpr - Create process - ignore
 epr - Exit process - ignore
  ld - Load module - break
       (only break for myvolflt)
  ud - Unload module - break
       (only break for MyVolFlt)

And issue bp command after kernel reloads boot loaded drivers.

Windows Kernel Source code

Windows Research Kernel sources.

Change system drive letter in Windows

Недавно пришлось устанавливать Windows 7 x64 из работающей Windows 7 x32 (болванки не было нормальной для загрузки с нее). В результате буква системного диска стала G. Я такого не люблю и попытался всяческими способами сменить ее на C. В результате система перестала грузиться или оказалась в состоянии что-то в духе человека-овоща, подключенного к аппарату поддержки жизнедеяльности. А все потому, что реестр захламлен путями к файлам драйверов, COM библиотек и прочей важной ерунды. А пути там, да, абсолютные, включают букву системного диска. Ура, товарищи! Букву системного диска сменить НЕЛЬЗЯ, устанавливайте с оптических или других носителей.

Windows UX guidelines

Постоянно трачу время на поиск этой странички: Windows User Experience Interaction Guidelines > Guidelines > Visuals > Layout.

Replacing standart scrollbars

Сейчас занимаемся созданием библиотеки элементов управления. UX команда, как обычно, выдумывает ненужный бред, а мы его рисуем. Порой, правда, приходится совсем туго (и даже не от того, что придурки-дизайнеры не думают головой). С одной из тугих проблем я боролся неделю. Проблема зовется заменить стандартные Windows Scrollbars на свои или просто owner draw scrollbars (custom scrollbar drawing). Гугление не дало абсолютно никакого полезного результата! Нашлась лишь одна статья на эту тему (Cool Scrollbars) и неработающий пример. Дальше вы прочитаете мой путь к решению и, конечно же, узнаете само решение.

Постановка задачи

Создать (запрограммировать) окно с полосой прокрутки вовсе несложно и есть два способа решения такой задачи: 1) рисовать на неклиентской (или даже клиентской) области, обрабатывать сообщения и т.д. 2) встраивать дополнительное окно, которое мимицирует поведение полосы прокрутки. Windows поддерживает оба механизма (смотреть There are two types of scrollbars и Scrollbars and Scrolling). Но для обоих случаев логика прокручивания ложится на разработчика и инкапсулируется в элементе управления. А что делать, если исходные коды недоступны, а полосы прокрутки нужно заменить на свои?

Итак, задача следующая - изменить внешний вид полос прокрутки у стандартных элементов управления (LISTBOX, COMBOBOX etc.), т.е. скроллбаров, которые появляются у окошек со стилем WS_VSCROLL или WS_HSCROLL.

Процесс подмены полос прокрутки (исследование проблемы)

Первое, что приходит в голову - убрать стиль WS_VSCROLL (займемся лишь вертикальной прокруткой, горизонтальная ничем не отличается), перехватить WM_NC-сообщения и рисовать свой красивый ползунок с прибамбасами. Все отлично, но есть проблемка: связь полоса прокрутки - элемент управления двунаправленная (скроллбар управляет окном и наоборот). В результате теряется реакция скроллбара на изменение состояния окна (например, активный элемент списка установлен нажатием клавиши END, соответственно, окно прокручено вниз).

Окно управляет состоянием ползунка с помощью метода int SetScrollInfo(HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, BOOL fRedraw). В случае отсутствия стиля WS_VSCROLL SetScrollInfo не вызывается, соответственно, уведомления от окна о необходимости изменить положение ползунка не приходят. В результате стиль WS_VSCROLL обязателен и рисуется стандартный скроллбар. Что дальше? Дальше мы выясняем, что провоцирует отрисовку полосы прокрутки. И стараемся предотвратить возникновение этих ситуаций.

Реакция полос прокрутки связана с обработкой окном WM_NC-сообщений. Это просто и логично. Первое, что я сделал - перехватил эти сообщения, чтобы отключить их стандартную обработку. Я был очень удивлен, когда после этого опять увидел скроллбар!

Дальше я нашел функцию отрисовки скроллбара в библиотеке comctl32.dll и смотрел кто ее дергает. У меня Windows Vista и включен Aero. Вот, что выяснилось в результате:

>  comctl32.dll!DrawThumb2()
   comctl32.dll!xxxDrawThumb()  + 0x57 bytes
   comctl32.dll!_CCSetScrollInfo@16()  - 0x8ef9 bytes
   uxtheme.dll!_ThemeSetScrollInfoProc@16()  + 0x5c12 bytes
   user32.dll!_SetScrollInfo@16()  + 0x3c bytes
   comctl32.dll!ListBox_SetScrollParms()  + 0x336 bytes
   comctl32.dll!ListBox_NewITopEx()  + 0x51 bytes
   comctl32.dll!ListBox_NewITop()  + 0x12 bytes
   comctl32.dll!ListBox_InsureVisible()  - 0x36beb bytes
   comctl32.dll!ListBox_SetISelBase()  + 0x2b bytes
   comctl32.dll!ListBox_KeyInput()  + 0x47b bytes
   comctl32.dll!ListBox_WndProc()  + 0x49b bytes
   user32.dll!_InternalCallWinProc@20()  + 0x23 bytes
   user32.dll!_UserCallWinProcCheckWow@32()  + 0xb3 bytes
   user32.dll!_CallWindowProcAorW@24()  + 0x51 bytes
   user32.dll!_CallWindowProcW@20()  + 0x1b bytes
   ScrollbarsCust.exe!LBWndProc(HWND__ * hWnd=0x00460d0e, unsigned int message=0x00000100, unsigned int wParam=0x00000023, long lParam=0x014f0001)  Line 322   C++
   user32.dll!_InternalCallWinProc@20()  + 0x23 bytes
   user32.dll!_UserCallWinProcCheckWow@32()  + 0xb3 bytes
   user32.dll!_DispatchMessageWorker@8()  + 0xe6 bytes
   user32.dll!_DispatchMessageW@4()  + 0xf bytes
   ScrollbarsCust.exe!wWinMain(HINSTANCE__ * hInstance=0x008a0000, HINSTANCE__ * hPrevInstance=0x00000000, wchar_t * lpCmdLine=0x000949b6, int nCmdShow=0x00000001)  Line 95 + 0xb bytes  C++
   ScrollbarsCust.exe!__tmainCRTStartup()  Line 578 + 0x1c bytes  C
   kernel32.dll!@BaseThreadInitThunk@12()  + 0x12 bytes
   ntdll.dll!___RtlUserThreadStart@8()  + 0x27 bytes
   ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes

Мы попали в функцию отрисовки после нажатия клавиши END, о чем говорят параметры вызова оконной процедуры ScrollbarsCust.exe!LBWndProc(HWND__ * hWnd=0x00460d0e, unsigned int message=0x00000100, unsigned int wParam=0x00000023, long lParam=0x014f0001). 0x00000100 - это WM_KEYDOWN. В стеке вызовов присутствует также функция SetScrollInfo - user32.dll!_SetScrollInfo@16(). И что самое интересное, именно она провоцирует отрисовку полосы прокрутки!

Погуглив функцию я нашел несколько заметок, из которых самой интересной оказалась SetScrollInfo() architecture bug. Ничего нового, впрочем, просто подтверждение моего результата.

Что делать? Единственный выход, который я увидел, - перехватить вызов функции SetScrollInfo. Продвинутые читатели, возможно, зададут вопрос - почему не перехватить функции отрисовки? Во-первых, адреса этих функций известны только через отладочные символы. Во-вторых, логика отрисовки инкапсулирована в библиотеке comctl32.dll и в других ее версиях этих функций может вовсе не быть. А SetScrollInfo - часть Windows API, который врядли будет меняться в ближайшее время.

Других факторов, провоцирующих отрисовку полос прокрутки я не нашел (WM_NC не в счет - их мы все равно перехватываем и обрабатываем сами). Правда, есть уверенность, что они существуют, просто не проявились.

На этом исследование мое завершилось, пора переходить к кодированию.

Процесс подмены полос прокрутки (кодирование)

Итак, перехватываем SetScrollInfo. Матчасть состоит из одной статьи Process-wide API spying - an ultimate hack и одной функции:

PVOID HookAPI(PBYTE pbModule, PCSTR pszName, PVOID pvOrg, PVOID pvNew) {
    PIMAGE_THUNK_DATA r;
    PIMAGE_NT_HEADERS p;
    PIMAGE_IMPORT_DESCRIPTOR q;

    p = (PIMAGE_NT_HEADERS)(pbModule + ((PIMAGE_DOS_HEADER)pbModule)->e_lfanew);
    q = (PIMAGE_IMPORT_DESCRIPTOR)(pbModule + p->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);

    for (; q->Name; q++) {
        if (lstrcmpiA(pszName, (PCSTR)(pbModule + q->Name)) == 0) {
            for (r = (PIMAGE_THUNK_DATA)(pbModule + q->FirstThunk); r->u1.Function; r++) {
                if ((PVOID)r->u1.Function == pvOrg) {
                    WriteProcessMemory(GetCurrentProcess(), &r->u1.Function, &pvNew, sizeof(PVOID), NULL);
                    return(pvOrg);
                }
            }
        }
    }
    return(NULL);
}

Что делаем? Сохраняем адрес оригинальной функции SetScrollInfo и подменяем ее адрес на свою реализацию:

typedef int (WINAPI *SetScrollInfoFun)(HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, BOOL fRedraw);
SetScrollInfoFun originalSetScrollInfo;

int WINAPI MySetScrollInfo(HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, BOOL fRedraw) {
    ...
}
HMODULE user32dllHandle = GetModuleHandle(_T("user32.dll"));
HMODULE comctl32dllHandle = GetModuleHandle(_T("comctl32.dll"));
originalSetScrollInfo = (SetScrollInfoFun)GetProcAddress(user32dllHandle, "SetScrollInfo");
HookAPI((PBYTE)comctl32dllHandle, "user32.dll", originalSetScrollInfo, &MySetScrollInfo);

Здесь, кстати, важно, что мы подменяем функцию только для кода в библиотеке conctl32.dll!

Вообще, для таких вещей существует интересная библиотека Microsoft Detours. Рекомендую взглянуть.

Кульминация спектакля - код функции MySetScrollInfo:

int WINAPI MySetScrollInfo(HWND hwnd, int fnBar, LPCSCROLLINFO lpsi, BOOL fRedraw) {
    int rv = originalSetScrollInfo(hwnd, fnBar, lpsi, /*fRedraw*/FALSE);
    ::SendMessage(hwnd, WM_USER + 1, 0, 0);
    return(rv);
}

Все просто - вызов оригинальной SetScrollInfo с измененным 4-м параметром (мы просим оригинал не рисовать полосу прокрутки, иначе изображение будет мигать). Далее нужно нарисовать свой ползунок с прибамбасами, для чего я посылаю окну специальное сообщение, на которое оно реагирует отрисовкой скроллбара.

Остается написать реакции на WM_NC-сообщения, код отрисовки полос прокрутки, код подмены оконной процедуры интересующего контрола и, наверное, фильтрацию окон в MySetScrollInfo - мы же не все окна хотим насиловать своими глупостями.

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

min max puff puff

Недавно мучался, не мог понять, почему не компилируется код std::numeric_limits<size_t>::max(). Долго тупил, пока не заметил, что компилятор пишет warning о нехватке параметров для макроса.

Оказалось, в файле WinDef.h есть такой код:

#ifndef NOMINMAX

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif

#ifndef min
#define min(a,b)            (((a) < (b)) ? (a) : (b))
#endif

#endif  /* NOMINMAX */

Идиотизм, честное слово. Перед включением Windows.h нужно определить NOMINMAX: #define NOMINMAX.

HP LaserJet 2015 and WL-500gP

ASUS WL-500g Premium ASUS WL-500g Premium я купил уже давненько, но все еще не "занимался" ним, как я любил заниматься с Линупсами.

HP LaserJet 2015 Сейчас возникла необходимость расшарить этот замечательный принтер HP LaserJet 2015 на два компа.

Покопавшись в гугле и в книжечке рутера было объявлено, что оно поддерживает принтеры, но не все. Поиск списка конкретных моделей успехом не увенчался, поэтому я решил просто попробовать.

Подключение принтера HP LaserJet 2015 к WL500gP и настройка маршрутизатора

Первое, что необходимо сделать, - подключить принтер через USB к порту рутера. В админке System Setup --> Services разрешить Enable LPR printing и Enable RAW printing. Samba для печати мне нафиг не нужна.

Ядро с радостью сообщает, что увидело принтер:

Jan 16 14:58:38 kernel: hub.c: new USB device 01:03.2-2, assigned address 3
Jan 16 14:58:39 kernel: printer.c: usblp0: USB Bidirectional printer dev 3 if 0 alt 0 proto 2 vid 0x03F0 pid 0x3817
Jan 16 14:58:39 kernel: printer.c: usblp0 Device ID string [170]='MFG:Hewlett-Packard;CMD:PJL,PML,POSTSCRIPT,PCLXL,PCL;MDL:HP LaserJet P2015 Series;CLS:PRINTER;DES:Hewlett-Packard LaserJet P2015 Series;MEM:MEM=23MB;COMMENT:RES=1200x1;'

В админке, правда, Status & Log --> Status не отображает модель и статус принтера. По началу я расстроился, подумал, что ничего не получится, но, все-таки, не остановился на достигнутом. Смотрю netstat -l:

tcp        0      0 *:printer               *:*                     LISTEN
tcp        0      0 *:laserjet              *:*                     LISTEN

Обана! Протокол laserjet, порт 9100! Перехожу к настройке принтера в Windows Vista и XP.

Добавление принтера в Windows Vista и XP

Windows Vista

  1. Иду в 'Control Panel\Printers' и делаю 'Add printer'. Далее 'Add a network, wireless or Bluetooth printer'.

    Choose a local or network printer

  2. Автоматически оно, понятное дело, ничего не нашло, поэтому смело жмем 'The printer that I want isn't listed'.

    Searching for available printers...

  3. Здесь выбираем 'Add a printer using a TCP/IP address or hostname'.

    Find printer by name or TCP/IP address

  4. Вбиваем IP адрес WL500gP.

    Type a printer hostname or IP address

  5. После длительной мозговой деятелности Windows говорит 'Additional port information required' и просит помочь в выборе правильного типа устройства. Нам нужен 'Hewlett Packard Jet Direct'.

    Additional port information required

  6. Наконец просят показать драйвера устройства. Я скачал с офсайта и указал.

    Install the printer driver

  7. Последний шаг - ввод имени принтера.

Как всегда, печатаем тестовую страничку. У меня все окей, а у тебя?

Windows XP

Процедура практически аналогична. Я, правда, делал не с нуля, а в текущих настройках принтера добавил сетевой порт и удалил старый - он мне больше не нужен!

Usability этого решения

Пока что проблем не возникало. Буду замечать грабли - обновлю страничку. В первую очередь интересует работа со спулером, очередью печати и поддержка PostScript 2 или 3.

UPDATE: WL-500gP HP 2015 problems.

Windows Server 2008 SDK and .NET 3.5

Прямой линк без всяких валидаций: Microsoft® Windows® Software Development Kit (SDK) for Windows Server® 2008 and .NET Framework 3.5!

Гвоздь в гроб Windows

20 минут назад мне подкинули в аське ссылочку на статью "Гвоздь в гроб Windows". Мне, как человеку, использовавшему UNIX-подобные ОС системы больше 6-ти лет, стало интересно - что нового может быть брошено в эту глупую войну. Вкратце основные пункты статьи:

  • будущее за unix-системами, и уже ясно, что это будет Linux

    А почему Linux? Почему не FreeBSD или OpenBSD или Solaris? Ответ на этот вопрос полностью содержится в статье, только надо поменять Windows на Linux.

  • Выпустив продукт единожды (вложив деньги в его разработку), корпорация Microsoft косит бешенные деньги на постоянно возростающем количестве потребителей продукта, тратя при этом копейки. Другими словами, каждый платит за то, за что уже заплатили многие другие.

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

  • Аналоги есть, и по своим характеристикам значительно превосходят Windows.

    По каким характеристикам и в чем превосходят? По количеству статей, которые я должен прочитать, чтобы настроить хоть что-то, что не было настроено при установке? Или по количеству команд, которые я вынужден набрать?

    Но при работе с ними есть ряд проблем, связанных с совместимостью программ, драйверами оборудования, невозможностью легально использовать закрытые патентами MS протоколы...

    Какие закрытые патентами протоколы? Проблема UNIX в том, что его ПО не соответствует потребностям пользователей. И, что самое плохое, - никто эти потребности выяснять не хочет. А Microsoft тем временем тратит кучу денег на создание удобных интерфейсов и повышение юзабилити.

  • они не заработали этих денег и близко.

    Кто "они"? Билл Гейтс? Свои деньги он заработал, уж поверь. А вот разработчики, написавшие Windows, действительно, своих денег не заработали (точнее, не получили), т.к. зарплата разработчика в MS колеблется от 75 до 150 тысяч в год (ровно, как и зарплата Билл Гейтса не составляет миллиарды). Остальные деньги сотрудники получают с опционов (акций) своей же компании. Чем больше человечек сделал для развития корпорации - тем больше он сможет купить опционов.

    Если кто-то говорит вам, что пользоваться нелицензионным Windows - воровство, то смело отвечайте, что эта корпорация обокрала всех нас, перетянув удавкой горло мировому рынку ПО и продавая задыхающимся пользователям свой пыльный воздух по цене золота.

    Если рынок ПО (в частности, бесплатного ПО) не способен составить конкуренцию платным продуктам, то Microsoft в это не виновата. Ровно, как и любая другая организация не виновата, что ее продукт - лучший. Никто никого не заставляет покупать Windows. Сиди на своем Linux-е, чем ты не доволен? Firefox используют не потому, что он бесплатный, а потому, что он лучше. И, стань он платный, его будут продолжать использовать. Конкуренция рождается, когда продукты взаимозаменяемы. О Windows и Linux этого сказать нельзя.

  • пользуйтесь такой операционной системой, которую дают бесплатно, поскольку деньги создатели зарабатывают не на вас, а на техподдержке

    В результате получаешь то, что создатели решили реализовать, не отрываясь от банки пива, а вовсе не то, что требуется пользователю. И, вместо траты увесистой суммы денег на то, что ему нужно, дешевле купить Windows, где подавляющая часть необходимого уже есть.

  • программист должен сполна получить за свою работу, и плюс премию, и плюс отпускные, и плюс все вышеперечисленное умножить на три, если работа хороша. Но не миллиарды.

    Никакой программист не получает миллиарды, откуда эта глупость появилась в твоей голове?

  • Стоимость рекламы товара не входит в его рыночную цену.

    Ошибаешься. Ты платишь за товар, за его рекламу и сам же ее потом смотришь.

  • Мировой продукт должен быть бесплатен, т.к. стоимость разработки полностью окупается рекламой фирмы-производителя при использовании продукта.

    Леонид Каганов, а ты сыт от того, что отрекламирован? Или ты все-же ждешь, что твоя реклама когда-то превратится в заказ с кругленькой суммой? Или, может, ты выполнишь заказ бесплатно в пользу еще большей рекламы? До тех пор, пока не умрешь с голоду. Microsoft уже давно прошла этот этап и сейчас рубит заслуженное бабло (при этом нахаляву продолжая себя рекламировать).

  • Этот сыр - бесплатный.

    Для тебя - почти бесплатный. Зато не бесплатный для провайдеров, через оборудование которых прошли байты этой картинки. Бесплатного сыра не бывает. Точней, даже за бесплатный сыр кто-то платит.

  • неграмотно спланированная, полная ошибок, лишенная системы безопасности с грамотным разграничением прав пользователей, она служит прекрасным компостом, в котором роятся черви и вирусы самых разных мастей.

    Автор, ты абсолютно некомпетентен, чтобы говорить подобное. Windows NT еще с версии 3.51 4.51 сертифицирована по уровню безопасности C2. И было это в 1995 году, а с тех пор много чего изменилось в ядре в лучшую сторону.

  • Интерфейс пользователя намного красивее и удобнее, например, у Макинтоша, откуда MS постоянно тырит решения.

    MS тырит, и правильно делает. А самый красивый и удобный интерфейс у удобной палки, которой можно колотить по пню.

  • быстрее всего исправляются ошибки в системах с открытым кодом.

    Беспочвенное заявление. Их там быстрее всего находят. И чаще находят. И находят порядком больше, чем в системах с закрытым исходным кодом. А Windows Update позволяет тебе быть уверенным, что дырки будут закрыты быстро и автоматически, без ежедневного чтения BugTraq. Да и лучше не исправлять ошибки, а выпускать софт без ошибок, но, оупенсорсу до этого далеко.

  • Да, Windows самая распространенная сегодня. А почему? Ответ прост: как мы уже говорили, это потому, что под Windows работают все программы, игры и любое оборудование. А почему они работают под Windows? Потому что это самая удобная среда для запуска программ и устройств? Напротив: большинство системных протоколов закрыто и нет документации. Программы и драйвера создают под Windows именно потому, что это самая распространенная система. Замкнутый круг.

    Они работают под Windows потому, что ОС представляет собой адекватную среду для разработки таких программ (как и UNIX для программ другого типа - сетевых сервисов). Потому, что аналога DirectX с аппаратной поддержкой видеокартами в UNIX-е нет и не будет. Потому, что графический сервер X11 - тормозящее устарелое убожество. Потому, что нет адекватных инструментальных средств для разработки.

  • Но замкнут этот круг не без помощи MS, который за ваши же деньги фактически подкупает производителей софта и игр, чтобы они не создавали аналогов под другие платформы, а создатели оборудования не раскрывали спецификаций, которые позволят написать драйвер кому-нибудь еще.

    Бред. Производители софта сначала выбирают ОС (и инструментарий), а потом уже создают продукт. А создатели оборудования продают свои спецификации! И правильно делают.

  • пришлось бы бегать к ним в соседний квартал чинить слетевший Windows - страшную штуку в руках деятельного и любопытного новичка.

    Заменить Windows на Linux.

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

    У каждого свои цели при использовании чего-либо. Кто-то любит наблюдать появление строчек в файле /var/log/xxx.log, жуя при этом позавчерашний бутер, найденный в системном блоке. Кто-то вынужден наблюдать за изменением квот на бирже дабы сходить в дорогой ресторан, и ему совершенно наплевать на то, какая идеология у ОС.

  • Все больше программ появляется под Linux. Фактически нет только хорошего Фотошопа, хотя Gimp уже близок.

    Хорошего Фотошопа нет и не будет. По крайней мере до тех пор, пока не появится нормальный современный векторный графический сервер. Нет, не сервер, а подсистема, в которой шрифты будут выглядеть одинаково качественно, а не корявиться после очередного апдейта, а возможности видеокарты будут задействованы по максимуму.

Если задуматься, то речь вообще не о Microsoft или программном обеспечении, а о стоимости интеллектуальной собственности. Такие же рассуждения можно провести в области музыки, литературы, кино.

В целом, с автором я согласен в том, что Microsoft гребет слишком много денег с пальца. В этом плане мне нравится лицензионная политика Oracle: используешь для зарабатывания денег - плати! Поэтому считаю, что для некоммерческого использования ОС должна быть бесплатной (или условно-бесплатной за 10 баксов). А послевкусие статьи у меня такое: оплачиваться должно создание корпоративного софта.

Мне кажется, что текущее положение вещей в области интеллектуальной собственности вполне рационально и адекватно - она (собственность) бесценна. Так что платим, товарищи. The best software money can buy.

Copyright 2007-2011 Chabster