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 7 x64 из работающей Windows 7 x32 (болванки не было нормальной для загрузки с нее). В результате буква системного диска стала G. Я такого не люблю и попытался всяческими способами сменить ее на C. В результате система перестала грузиться или оказалась в состоянии что-то в духе человека-овоща, подключенного к аппарату поддержки жизнедеяльности. А все потому, что реестр захламлен путями к файлам драйверов, COM библиотек и прочей важной ерунды. А пути там, да, абсолютные, включают букву системного диска. Ура, товарищи! Букву системного диска сменить НЕЛЬЗЯ, устанавливайте с оптических или других носителей.
Постоянно трачу время на поиск этой странички: Windows User Experience Interaction Guidelines > Guidelines > Visuals > Layout.
Сейчас занимаемся созданием библиотеки элементов управления. 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
- мы же не все окна хотим насиловать своими глупостями.
Описанное не претендует на конечное решение, код приведен исключительно для понимания механизма, которым была побеждена проблема подмены стандартных полос прокрутки. Возможно, я доведу это все до консистентности и выдам библиотеку, которая позволит элементарно настраивать характеристики и внешний вид скроллбаров любых окон. Но, это будет нескоро.ы
Недавно мучался, не мог понять, почему не компилируется код 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
.
ASUS WL-500g Premium я купил
уже давненько, но все еще не "занимался" ним, как я любил заниматься с Линупсами.
Сейчас
возникла необходимость расшарить этот замечательный принтер HP LaserJet 2015 на два компа.
Покопавшись в гугле и в книжечке рутера было объявлено, что оно поддерживает принтеры, но не все. Поиск списка конкретных моделей успехом не увенчался, поэтому я решил просто попробовать.
Первое, что необходимо сделать, - подключить принтер через 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.
Как всегда, печатаем тестовую страничку. У меня все окей, а у тебя?
Процедура практически аналогична. Я, правда, делал не с нуля, а в текущих настройках принтера добавил сетевой порт и удалил старый - он мне больше не нужен!
Пока что проблем не возникало. Буду замечать грабли - обновлю страничку. В первую очередь интересует работа со спулером, очередью печати и поддержка PostScript 2 или 3.
UPDATE: WL-500gP HP 2015 problems.
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.