В поисках возможной замены проприетарной VMWare уже довольно давно нашел для себя VirtualPC. В общем то, учитывая её бесплатность, это совершенно потрясающая утилита от Microsoft для создания виртуальных машин в Windows среде.
Тем более она обладает некоторыми очень даже приятными особенности:
1. Просто отлично работает с WinDbg.
2. Размер (30 MB).
3. Виртуализация.
4. Поддержка всех Windows (в т.ч. и x64) в качестве хостов.
5. Бесплатность.
Но, отдельно следует выделить её самые заметные (по крайней мере для меня) недостатки:
1. Отсутствие поддержки гостевых 64битных систем.
2. Отсутствие snapshots.
3. Необходимость дополнительной настройки "продвинутых" сетевых схем.
К сожалению с 64битными системами проблема нерешаема, остается только надеяться что парни из Microsoft в будущем добавят эту возможность.
А вот отсутствие snapshots можно частично компенсировать копируя руками виртуальные диски или с помощью "Settings -> Undo Disks -> Enable undo disks". Если включена эта опция, то при завершении работы с VirtualPC будет задан вопрос сохранить ли изменения или нет.
С "продвинутыми" сетевыми схемами всё вообще решается в пару кликов. Дело в том что по умолчанию VirtualPC не создает никаких дополнительных адаптеров на хостовой машине и, если нужно сделать "прямое соединение" между хостовой и гостевой ОС, нужно самому позаботиться об их установке.
Установка дополнительных Loopback Adapters на хостовой машине:
1. "Start -> Settings -> Control Panel -> Add Hardware".
2. Запустится мастер установки нового оборудования. После непродолжительных поисков он спросит установлен ли уже девайс. Выбираем: "Yes, I have already connected the hardware". Next.
3. После "Add a new hardware device". Next.
4. После "Install hardware that I manually select from a list (Advanced)". Next.
5. После Выбираем в списке "Network Adapters". Next.
7. Manufacturer: "Microsoft", Network Adapter: "Microsoft Loopback Adapter". Next.
Всё. Теперь единственное что осталось, так это связать созданую сетевую карту с картой виртуальной машины:
VirtualPC->Settings->Networking->Adapter1->Microsoft Loopback Adapter.
Похоже получилось замечательное соединение, закрытое от других сетей. :)
вторник, 15 июля 2008 г.
пятница, 15 февраля 2008 г.
PE Kernel Loader
На днях баловался с загрузчиком для ОС. Требованиями были минимум выполняемых действий (остальное должно выполняться уже в ядре) и удобный и готовый к страничной адресации формат загружаемого ядра.
После некоторых размышлений пришел к такому варианту:
1. в первичном загрузчике считываем в память вторичный загрузчик и ядро. Прыгаем во вторичный загрузчик;
2. по адресу 2k (0x800) размещаем GDT;
3. переходим в защищенный режим (куда уж без него то :) );
4. загружаем PE ядро. Прыгаем в него.
Довольно удачный компромис, на мой взгляд. И загрузчик получился довольно простой и ядро я теперь могу писать в любимой Visual Studio, как почти обычное 32бит приложение.
Недостатки компилятора от Майкрософт для такого рода занятий это уже вопрос второй ;)
Основной код:
include 'struct.inc'
include 'pe.inc'
include 'boot.inc'
PAGE_SIZE = 0x1000
GDT_OFFSET = 0x800
; Global Descriptor Table
GDT:
dd 0,0
db 0FFh, 0FFh, 00h, 00h, 00h, 10011010b, 11001111b, 00 ; code
db 0FFh, 0FFh, 00h, 00h, 00h, 10010010b, 11001111b, 00 ; data
GDT_size equ $-GDT
GDTR dw GDT_size-1
dd GDT_OFFSET
loader_entry:
; open address line A20
in al, 92h
or al, 2
out 92h, al
; copy GDT to the 2nd kb RAM
; это удобно, поскольку в первых 2к расположим IDT
mov cx, GDT_size
mov di, GDT_OFFSET
mov si, GDT
rep movsb
lgdt fword [GDTR]
; disable all ints
; в том числе и немаскируемые
cli
in al, 70h
or al, 80h
out 70h, al
; jump to PM
mov eax, cr0
or al, 1
mov cr0, eax
; load new selector to the CS
jmp 00001000b:.protected_entry
use32
.protected_entry:
; init selectors
mov ax,00010000b
mov ds, ax
mov es, ax
mov ss, ax
;
; simple PE loader for loading PE kernel.
;
mov ebx, kernel_image
cmp word [ebx + IMAGE_DOS_HEADER.e_magic], IMAGE_DOS_SIGNATURE
jne .image_error
add ebx, [ebx + IMAGE_DOS_HEADER.e_lfanew]
cmp dword [ebx + IMAGE_NT_HEADERS.Signature], IMAGE_NT_SIGNATURE
jne .image_error
mov dx, [ebx + IMAGE_NT_HEADERS.FileHeader.NumberOfSections]
mov eax, ebx ; PE header
add ebx, sizeof.IMAGE_NT_HEADERS
cld
@@:
mov ecx, [ebx + IMAGE_SECTION_HEADER.SizeOfRawData]
mov esi, [ebx + IMAGE_SECTION_HEADER.PointerToRawData]
add esi, kernel_image
mov edi, [ebx + IMAGE_SECTION_HEADER.VirtualAddress]
add edi, [eax + IMAGE_NT_HEADERS.OptionalHeader.ImageBase] ; ImageBase
rep movsb
add ebx, sizeof.IMAGE_SECTION_HEADER
dec dx
jnz @b
mov ebx, [eax + IMAGE_NT_HEADERS.OptionalHeader.ImageBase]
add ebx, [eax + IMAGE_NT_HEADERS.OptionalHeader.AddressOfEntryPoint]
jmp ebx ; Jump to kernel entry point
.image_error:
jmp $
kernel_image:
; вот это собственно наше ядро
file 'kernel.exe'
Хороший пример кода fasm для перевода в PM и обработки прерываний сделал и описал Great на wasm.ru.
Пример похожего решения, но для gcc и nasm можно найти на классном сайте lowlevel.ru
После некоторых размышлений пришел к такому варианту:
1. в первичном загрузчике считываем в память вторичный загрузчик и ядро. Прыгаем во вторичный загрузчик;
2. по адресу 2k (0x800) размещаем GDT;
3. переходим в защищенный режим (куда уж без него то :) );
4. загружаем PE ядро. Прыгаем в него.
Довольно удачный компромис, на мой взгляд. И загрузчик получился довольно простой и ядро я теперь могу писать в любимой Visual Studio, как почти обычное 32бит приложение.
Недостатки компилятора от Майкрософт для такого рода занятий это уже вопрос второй ;)
Основной код:
include 'struct.inc'
include 'pe.inc'
include 'boot.inc'
PAGE_SIZE = 0x1000
GDT_OFFSET = 0x800
; Global Descriptor Table
GDT:
dd 0,0
db 0FFh, 0FFh, 00h, 00h, 00h, 10011010b, 11001111b, 00 ; code
db 0FFh, 0FFh, 00h, 00h, 00h, 10010010b, 11001111b, 00 ; data
GDT_size equ $-GDT
GDTR dw GDT_size-1
dd GDT_OFFSET
loader_entry:
; open address line A20
in al, 92h
or al, 2
out 92h, al
; copy GDT to the 2nd kb RAM
; это удобно, поскольку в первых 2к расположим IDT
mov cx, GDT_size
mov di, GDT_OFFSET
mov si, GDT
rep movsb
lgdt fword [GDTR]
; disable all ints
; в том числе и немаскируемые
cli
in al, 70h
or al, 80h
out 70h, al
; jump to PM
mov eax, cr0
or al, 1
mov cr0, eax
; load new selector to the CS
jmp 00001000b:.protected_entry
use32
.protected_entry:
; init selectors
mov ax,00010000b
mov ds, ax
mov es, ax
mov ss, ax
;
; simple PE loader for loading PE kernel.
;
mov ebx, kernel_image
cmp word [ebx + IMAGE_DOS_HEADER.e_magic], IMAGE_DOS_SIGNATURE
jne .image_error
add ebx, [ebx + IMAGE_DOS_HEADER.e_lfanew]
cmp dword [ebx + IMAGE_NT_HEADERS.Signature], IMAGE_NT_SIGNATURE
jne .image_error
mov dx, [ebx + IMAGE_NT_HEADERS.FileHeader.NumberOfSections]
mov eax, ebx ; PE header
add ebx, sizeof.IMAGE_NT_HEADERS
cld
@@:
mov ecx, [ebx + IMAGE_SECTION_HEADER.SizeOfRawData]
mov esi, [ebx + IMAGE_SECTION_HEADER.PointerToRawData]
add esi, kernel_image
mov edi, [ebx + IMAGE_SECTION_HEADER.VirtualAddress]
add edi, [eax + IMAGE_NT_HEADERS.OptionalHeader.ImageBase] ; ImageBase
rep movsb
add ebx, sizeof.IMAGE_SECTION_HEADER
dec dx
jnz @b
mov ebx, [eax + IMAGE_NT_HEADERS.OptionalHeader.ImageBase]
add ebx, [eax + IMAGE_NT_HEADERS.OptionalHeader.AddressOfEntryPoint]
jmp ebx ; Jump to kernel entry point
.image_error:
jmp $
kernel_image:
; вот это собственно наше ядро
file 'kernel.exe'
Хороший пример кода fasm для перевода в PM и обработки прерываний сделал и описал Great на wasm.ru.
Пример похожего решения, но для gcc и nasm можно найти на классном сайте lowlevel.ru
четверг, 13 декабря 2007 г.
Реинжект на FWPM_LAYER_INBOUND_IPPACKET_V4
В WFP есть одна маленькая хитрость для реинжекта входящих пакетов на сетевом уровне: необходимо что бы данные начинались с IP заголовка, а не сразу за ним как это происходит в буферах по дефолту.
Т.е. где то в коде (до или после клонирования) нужно вызвать NdisRetreatNetBufferDataStart на размер IP заголовка. Это будет выглядеть приблизительно следующим образом:
...
NdisRetreatNetBufferDataStart( pNetBuffer,
inMetaValues->ipHeaderSize, //размер IP заголовка
0, NULL );
...
FwpsAllocateCloneNetBufferList0(
pNetBufferList,
NULL,
NULL,
0,
&pClonedNetBufferList);
FwpsInjectNetworkReceiveAsync0( ... , pClonedNetBufferList, ... );
P.S. Как показала практика лучше делать NdisRetreatNetBufferDataStart до клонирования, иначе можно получить совсем не то что ожидается.
Т.е. где то в коде (до или после клонирования) нужно вызвать NdisRetreatNetBufferDataStart на размер IP заголовка. Это будет выглядеть приблизительно следующим образом:
...
NdisRetreatNetBufferDataStart( pNetBuffer,
inMetaValues->ipHeaderSize, //размер IP заголовка
0, NULL );
...
FwpsAllocateCloneNetBufferList0(
pNetBufferList,
NULL,
NULL,
0,
&pClonedNetBufferList);
FwpsInjectNetworkReceiveAsync0( ... , pClonedNetBufferList, ... );
P.S. Как показала практика лучше делать NdisRetreatNetBufferDataStart до клонирования, иначе можно получить совсем не то что ожидается.
понедельник, 26 ноября 2007 г.
Плагины к Winamp
Нашел на диске свои плагины к Winamp, делал когда-то для удобства. Выложил на народе с сырцами.
SendTo (screenshot) - позволяет закидывать файлы в выбранную папку прямо с плейлиста.
Shutdown (screenshot) - вырубает комп по достижению конца плейлиста.
P.S. foobar2000 рулит :)
SendTo (screenshot) - позволяет закидывать файлы в выбранную папку прямо с плейлиста.
Shutdown (screenshot) - вырубает комп по достижению конца плейлиста.
P.S. foobar2000 рулит :)
Дни разработчиков от Microsoft 2007. Одесса.
Сегодня с Андреем посетили это знаменательное событие, которое проходило в отеле "Валентина". Конечно, когда пришлось вставать в жуткую рань (находился этот отель на другом конце города), в невыспавшуюся голову то и дело приходили мысли на кой черт сдалось мне это событие со всей его знаменательностью. Само собой на регистрацию и утренний кофе тайм мы опоздали (в первую очередь благодаря мне), так что по приходу нас сразу же ждал средних размеров зал с сотрудником Майкрософт на сцене.
Да, во время регистрации нам задарили бейджики, ручку и блокнот с соответсвующей эмблемкой, а так же диск с Visual Studio 2008 b2. Эх знал бы, то не скачивал бы :). Ещё анкетку, которая затем, заполнившись, обменивалась на футболку с надписью Silverlight.
На повестке дня стояли следующие темы:
- silverlight
- Team Foundation Server
- SQL Server 2008
- VS 2008
Приятно заметить что после двух лекций (к сожалению я не записал имена ведущих) был такой очень миленький перерывчик с чаем, кофе, будербродами и прочей снедью в виде пирожных. В общем классно.
Относительно содержания докладов тоже всё было в порядке. Интересно, с пользой, с юмором. Мило и ненавязчиво были политы грязью "неверные" а ля IBM, PHP, линуксоиды. В общем дух мелкомягких витал в воздухе :).
В принципе узнал много нового о продуктах ближайшего будущего, например тот же silverlight, это очень симпатичный веб клиент, облегченный родственник .net framework. Новая VS 2008 это просто блеск, все добавленные возможности относящиеся к анализу кода, тестированию, профилированию, оценке и тп. даже сложно перечислить. Уже поставил себе - балдею, осталось 109 дней. Team Foundation Server и SQL Server 2008 разработчики тоже не в потолок плевали.
Кстати, было акцентировано внимание на всесторонней поддержке Майкрософтом opensource community. В принципе ничего нового, слыхали такое и на channel 9, но всё равно чуть не прослезился от осознания бескрайнего альтруизма компании.
Единственный существенный недостаток всего мероприятия , это время проведения, всё таки в выходной было бы лучше и народу было бы проще прийти. Но, с какой стороны не посмотри, а всё таки очень даже замечательный получился семинарчик, молодцы ребята, толково сделали.
- silverlight
- Team Foundation Server
- SQL Server 2008
- VS 2008
Приятно заметить что после двух лекций (к сожалению я не записал имена ведущих) был такой очень миленький перерывчик с чаем, кофе, будербродами и прочей снедью в виде пирожных. В общем классно.
В принципе узнал много нового о продуктах ближайшего будущего, например тот же silverlight, это очень симпатичный веб клиент, облегченный родственник .net framework. Новая VS 2008 это просто блеск, все добавленные возможности относящиеся к анализу кода, тестированию, профилированию, оценке и тп. даже сложно перечислить. Уже поставил себе - балдею, осталось 109 дней. Team Foundation Server и SQL Server 2008 разработчики тоже не в потолок плевали.
Кстати, было акцентировано внимание на всесторонней поддержке Майкрософтом opensource community. В принципе ничего нового, слыхали такое и на channel 9, но всё равно чуть не прослезился от осознания бескрайнего альтруизма компании.
Единственный существенный недостаток всего мероприятия , это время проведения, всё таки в выходной было бы лучше и народу было бы проще прийти. Но, с какой стороны не посмотри, а всё таки очень даже замечательный получился семинарчик, молодцы ребята, толково сделали.
пятница, 2 ноября 2007 г.
Распространение приложений скомпилированных с Visual Studio 2005
Должно быть каждый, кто пытался запустить приложение скомпилированное с Visual Studio 2005 на чистой машине, был неприятно удивлен сообщением об ошибке. Причиной является невозможность найти библиотеки времени исполнения, указанные в встраиваемом по умолчанию манифесте.
Исходя из этого, у нас есть два основных метода распространения приложения:
1. Скомпилировать приложение со статической библиотекой времени исполнения.
Для этого следует:
- отключить манифест (Project Options -> Linker -> Manifest File -> Generate Manifest = No );
- указать статическую библиотеку времени исполнения (Project Options -> С\С++ -> Code Generation -> Runtime Library = Multi-threaded /MT ).
Недостатками этого метода является увеличенный размер приложения (теперь внутри него необходимые функции из библиотеки) и то что Microsoft всё же рекомендует его избегать .
2. Поставлять с приложением необходимую библиотеку.
Одно из решений предлагаемых Microsoft - использовать Visual C++ Runtime Libraries весом в 2.6 МБ, которые можно скачать здесь, либо найти в Visual Studio (%Путь к папке с VS2005%\SDK\v2.0\BootStrapper\Packages\vcredist_x86).
Более подробно о рекомендациях Microsoft можно прочесть в статье Choosing a Deployment Method.
Исходя из этого, у нас есть два основных метода распространения приложения:
1. Скомпилировать приложение со статической библиотекой времени исполнения.
Для этого следует:
- отключить манифест (Project Options -> Linker -> Manifest File -> Generate Manifest = No );
- указать статическую библиотеку времени исполнения (Project Options -> С\С++ -> Code Generation -> Runtime Library = Multi-threaded /MT ).
Недостатками этого метода является увеличенный размер приложения (теперь внутри него необходимые функции из библиотеки) и то что Microsoft всё же рекомендует его избегать .
2. Поставлять с приложением необходимую библиотеку.
Одно из решений предлагаемых Microsoft - использовать Visual C++ Runtime Libraries весом в 2.6 МБ, которые можно скачать здесь, либо найти в Visual Studio (%Путь к папке с VS2005%\SDK\v2.0\BootStrapper\Packages\vcredist_x86).
Более подробно о рекомендациях Microsoft можно прочесть в статье Choosing a Deployment Method.
пятница, 26 октября 2007 г.
Приоритет процесса при запуске
Раз уж зашла речь о приоритетах, то сразу скажу о возможности установки приоритета процесса при запуске средствами Windows.
Как известно Windows по умолчанию запускает процессы с приоритетом Normal, который можно повысить или понизить во время выполнения, к примеру, из TaskManager.
Если же мы хотим установить базовый приоритет при старте приложения, то можно воспользоваться командой start:
cmd /c start /[приоритет] application.exe
где, [приоритет] = LOW, BELOWNORMAL, NORMAL, ABOVENORMAL, HIGH, REALTIME
Что бы избавить себя от раздражающих задержек при одновременном просмотре фильма и игры, для игры был создан ярлык следующего содержания:
%windir%\system32\cmd.exe /c start /low d:\games\lineage2\system\la2.exe
Как известно Windows по умолчанию запускает процессы с приоритетом Normal, который можно повысить или понизить во время выполнения, к примеру, из TaskManager.
Если же мы хотим установить базовый приоритет при старте приложения, то можно воспользоваться командой start:
cmd /c start /[приоритет] application.exe
где, [приоритет] = LOW, BELOWNORMAL, NORMAL, ABOVENORMAL, HIGH, REALTIME
Что бы избавить себя от раздражающих задержек при одновременном просмотре фильма и игры, для игры был создан ярлык следующего содержания:
%windir%\system32\cmd.exe /c start /low d:\games\lineage2\system\la2.exe
Подписаться на:
Сообщения (Atom)