Моя первая, более или менее, нормальная схема.
Add(MainForm,2953706,21,105)
{
Width=622
Height=317
Color=16777215
Caption="Virus Scaner"
BorderStyle=3
Icon=[ZIPBE25000078DAED994148146114C7BF6D8D55222C8CDD55D7DD92352BB224090ACA2D41E8D2AD4E76D843D72EEAA108D225A14B0AE221D0442922E9200A1D4490B64C23C82E51EA25D643051A219820116EEF3733810CB3B6ABCDBA0BF3647CCB38F3BEFFFBBEF7FEEFBD552997FCD4D62AF97D500D5529E5554A1D914B6EA9A8D2EF6B724939E288238E38E2C85665576969E981B2B2B2C315151565757575BBF3093B985B5B5B6FAEAEAEAE0D0E0E3E123FAAF3C4070D7B7373F3ED9595955F4943FAFAFA9EE6810F96D8F3C4874DB1E7B80F6961CF551FE01972351DECB9E8031C09CF2433945CF181D88123935B107C080402C743A1903F180C56F2B9BCBCFC24977CAE115DE5F3F9BCE170D863177EF68F7D04CB567CE8E9E979DED9D9D93F3131F1767E7EFECBECECEC37AEB9B9B9AFD3D3D31F0606061E3734345C618D929292BDDAA895633EA423F8128D46AF4BBE05ED88B96CF80047F4F7F73F21B624E60AF3D1074462ED0D3EE4D2392C2E2EAE4E4E4E7E1A1D1D7D29D78BE1E1E1D78944E2C766B92FB97D88FAB3933E1013BDBDBD43C23517FD7EFF5130890EC9FE86C5C6D9582C763F951FD41DE1ADFD3BC54BE08A4422D7047B20452CB8A98FF8363535F5D1FC3E7C257F3FC57376F900A7C39156FB0E76C9C37DFFB223368A04E77938D56CA7A3A3E39E5D6780509BE077F3BA46CC04D2B553595959DCD4D474C38A57A97376E1A7AE529BCCB92A6B5EC8903F5C9C2539BED1D6D2D2D24FB97FDA2EFCAC499C6E5C736C6CEC3DB991A92DAFD7EBEBEAEA7A683E0362CB2EFCF432F4031BD71B1919890BCF1CCCD4163144BC9BF1CB1E45B2891F7E872333B545FFD3D2D2722B9BF8A99366DEA036C1EF5BE8D54BDADBDB3B2DF0D7DBB8FF55708499F7A94D99F236B3C6F8F8F83B330FCB1A67ECC24FFF4E0F6CDE33EA2AB52983732C923EFAAA79CE9B9999F92CB178CC2EFCCC1EF4EF56B597BA0AAE74EBA0E4FD2BB31D6627F6C8E619B3DA1C43083D01DC07AFA49A4BF00FEC52EF9E99DF87FBE5FD7376CFA0F006B387D58C4F6E5357C108BFE30BCF93ABC43B3163B5EF487777F703DEC9C298EC626E62F648D5CB5157A94DF03B1C09CF90ABA9BED730FA861362BB201B73BE11C335CC1EDB9D5F161616BE3736365E96B8DF93CDEF2A98F9F0613BF319FB0EF674FA56BBCE811985D9C3DC176D26E42AF14ECC647BDFADBE73A46767F620DED953F059CD08F03B1C09CF18B95AA07247DCF8418DA607864BE9658CAB9EBA4A6D82DFF3EC7F208E38E288239AE86CFC1FF46F43AFB5E97A39A2EB4448D7F1625DB77B74ADDC867619F7B1C5734A45B4F7942AD6EC28E5D1EC0A216BEBA83B9A5E772563DAFAEE64DCD0094D7B52EA65CBFB7FDFBB6BD8891976E34997AE0BB5F5049086430069B8044848D3EBAA6D1BFBF607888E9E59]
Position=1
link(onCreate,6401369:doLoad,[(167,125)(167,34)])
}
Add(MultiElementEx,6401369,280,28)
{
@Hint=#17:Virus base loader|
@Color=16755285
link(onLoad,1304213:doAdd,[])
link(onFileAccessError,13039462:In,[])
}
BEGIN_SDK
Add(EditMultiEx,3635503,21,21)
{
WorkCount=#6:doLoad|
EventCount=#6:onLoad|41:onFileAccessError=Файл hash.vdb не найден|
Width=160
Height=102
link(doLoad,5548349:doFileExists,[(42,27)(42,48)])
}
Add(FileStream,4140657,35,77)
{
FileName="hash.vdb"
link(onLoad,4317369:doDeCompress,[(75,83)(75,90)])
}
Add(StreamConvertor,12585852,133,77)
{
Mode=6
link(onResult,3635503:onLoad,[(173,83)(173,27)])
}
Add(LZH,4317369,84,77)
{
link(onStream,12585852:doConvert,[])
}
Add(InfoTip,8670772,28,63)
{
Info=#20:Загрузка листа хешей|
Width=148
Height=53
}
Add(FileTools,5548349,63,21)
{
FileName="hash.vdb"
link(onEnd,3016481:doEvent,[])
}
Add(IndexToChanel,3016481,105,21)
{
link(onEvent1,3635503:onFileAccessError,[(159,27)(159,34)])
link(onEvent2,4140657:doOpen,[(149,34)(149,58)(23,58)(23,83)])
}
END_SDK
Add(LineBreak,16446509,-21,126)
{
Caption="exit"
link(Out,2953706:doClose,[])
Primary=[13039462,343,-91]
}
Add(StrList,1304213,371,28)
{
@Hint=#30:загруженная база хешей вирусов|
@Color=16755285
}
Add(ButtonRush,1691435,273,140)
{
@Color=65535
Left=5
Top=5
Width=175
Height=20
Font=[Tahoma,8,0,0,204]
Hint="Какую папку?"
HintManager="hm1"
ColorText=16711680
GradientStyle=0
BorderWidth=0
ColorTextOver=7566195
BorderColorOver=15780518
ShadowOffsetOver=0
GradientStyleOver=0
ColorFromDown=16777215
ColorToDown=0
ColorTextDown=5789784
BorderColorDown=16711680
ShadowOffsetDown=0
GradientStyleDown=0
ColorTextDis=12632256
ShadowOffsetDis=0
GradientStyleDis=0
BorderWidthDis=0
Caption="Выбрать место сканирования"
Glyphs=[]
Point(doEnabled)
link(onClick,4989731:doBrowse,[])
}
Add(ChildPanelRush,7904715,21,154)
{
@Hint=#23:Святая святых программы|
@Color=5635925
}
BEGIN_SDK
Add(EditMultiEx,9831823,21,21)
{
Width=146
Height=53
}
Add(PanelRush,13624531,49,28)
{
Left=450
Top=260
Width=164
Height=20
Color=16777215
Font=[Tahoma,8,0,0,204]
Hint="Нажми сюда!"
HintManager="parent.hm1"
ColorTo=0
BorderColor=15780518
GradientStyle=0
Caption="Программа создана в HiAsm"
HAlign=2
Glyphs=[]
link(onClick,5085656:doShellExec,[(93,34)(93,41)])
}
Add(WinExec,5085656,105,28)
{
FileName="http://www.HiAsm.com/"
}
END_SDK
Add(StyleXP,14430748,21,189)
{
}
Add(InfoTip,7575430,259,14)
{
Info=#27:Загрузка базы хешей вирусов|
Width=162
Height=74
}
Add(Edit,8716298,385,140)
{
Left=185
Top=5
Width=425
Color=16777215
Font=[Tahoma,8,0,8421504,204]
Hint="Путь к папке"
HintManager="hm1"
Text=""
Point(doEnabled)
}
Add(Browse,4989731,329,140)
{
Title="Выбор места сканирования"
Edit=1
NewDirButton=1
link(onBrowse,8716298:doText,[])
}
Add(InfoTip,9975523,266,119)
{
Info=#29:Выбор параметров сканирования|
Width=176
Height=109
}
Add(Edit,10604717,329,189)
{
Left=520
Top=30
Width=40
Color=16777215
Font=[Tahoma,8,0,8421504,204]
Hint="Не знаешь - не меняй"
HintManager="hm1"
Text="*"
Alignment=2
Point(doEnabled)
}
Add(GLabel,12754671,271,189)
{
Left=5
Top=30
Width=510
Color=16777215
Font=[Tahoma,8,0,0,204]
Caption="Какой формат файлов сканировать? Например: exe, jpg, rar, zip и т.д. (*) без скобок - все файлы."
AutoSize=1
Alignment=2
VAlignment=0
Antialiased=0
}
Add(FormatStr,3742957,329,273)
{
DataCount=1
Mask="*.%1"
Point(FString)
link(Str1,10604717:Text,[])
}
Add(InfoTip,14704997,266,259)
{
Info=#36:Собственно, сам процесс сканирования|
Width=344
Height=102
}
Add(ButtonRush,12167223,182,273)
{
@Hint=#19:Начать сканирование|
@Color=65535
Left=225
Top=260
Width=175
Height=20
Font=[Tahoma,8,0,0,204]
Hint="Поехали"
HintManager="hm1"
ColorText=16711680
GradientStyle=0
BorderWidth=0
ColorTextOver=7566195
BorderColorOver=15780518
ShadowOffsetOver=0
GradientStyleOver=0
ColorFromDown=16777215
ColorToDown=0
ColorTextDown=5789784
BorderColorDown=16711680
ShadowOffsetDown=0
GradientStyleDown=0
ColorTextDis=12632256
ShadowOffsetDis=0
GradientStyleDis=0
BorderWidthDis=0
Caption="Приступить к сканированию"
Glyphs=[]
Point(doVisible)
link(onClick,10558155:doEvent1,[])
}
Add(Hub,15865795,154,175)
{
OutCount=4
link(onEvent1,1691435:doEnabled,[(220,181)(220,146)])
link(onEvent2,8716298:doEnabled,[(276,188)(276,160)])
link(onEvent3,10604717:doEnabled,[(248,195)(248,209)])
link(onEvent4,12167223:doVisible,[(175,202)(175,279)])
}
Add(ChanelToIndex,8280263,112,175)
{
link(onIndex,15865795:doEvent1,[])
}
Add(InfoTip,8719916,56,147)
{
Info=#56:Блокирование того, что при сканировании не пригодится :)|
Width=169
Height=67
}
Add(Hub,10558155,224,273)
{
OutCount=5
PColor(onEvent4,21930)
link(onEvent1,8280263:doWork1,[(250,279)(250,230)(100,230)(100,181)])
link(onEvent2,3742957:doString,[(284,286)(284,279)])
link(onEvent3,4078340:In,[])
link(onEvent4,9302323:doClear,[(476,300)(476,328)])
link(onEvent5,13882503:doStart,[(262,307)(262,321)])
}
Add(FileSearch,684567,329,315)
{
Ext=""
link(onSearch,14777655:doEvent1,[])
link(onEndSearch,8280263:doWork2,[(373,328)(373,258)(100,258)(100,188)])
link(Ext,3742957:FString,[])
link(Dir,8716298:Text,[(342,243)(391,243)])
}
Add(PointHint,8744855,448,189)
{
Info=#84:Мне кажется, что при маске расширения *.* файлы без расширения не ищутся. Проверить.|
Width=491
Height=25
}
Add(PointHint,13623343,448,140)
{
Info=#41:Нужно добавить проверки на пустоту полей.|
Width=246
Height=25
}
Add(Thread,13882503,287,315)
{
Delay=0
FastStop=0
link(onExec,684567:doSearch,[])
}
Add(ListBox,9302323,714,315)
{
Left=5
Top=70
Width=605
Height=180
Font=[Tahoma,8,0,8421504,204]
Visible=1
DataType=1
ItemHeight=15
BoxDrawManager="bdm1"
Point(doVisible)
Point(doEnsureVisible)
Point(onMouseUp)
Point(String)
link(onChange,3886392:doCalc,[])
link(onMouseUp,7163521:doEvent,[])
}
Add(DoData,15074134,658,357)
{
Data=Integer(1)
link(onEventData,9302323:doVisible,[])
}
Add(FastMathParse,3886392,763,315)
{
DataCount=1
MathStr="%1-1"
ResultType=0
link(onResult,9302323:doEnsureVisible,[(807,321)(807,345)(702,345)(702,370)])
link(X1,9302323:Count,[(769,303)(748,303)(748,393)(727,393)])
}
Add(Hashsum,10620622,427,315)
{
link(onResult,1582898:doFind,[])
}
Add(LineBreak,11101021,616,357)
{
@Hint=#70:Делаем видимым ListBox, куда и будут выводиться найденные файлы-вирусы|
Caption=">>>"
link(Out,15074134:doData,[])
Primary=[4078340,-364,-70]
}
Add(ArrayFind,1582898,476,315)
{
link(onFind,15066127:doCompare,[])
link(Array,1304213:Array,[(482,194)(391,194)])
}
Add(If_else,15066127,525,315)
{
Op2=Integer(-1)
link(onFalse,8287601:doData,[(565,328)(565,321)])
link(Op1,1582898:ItemIdx,[(531,303)(507,303)(507,359)(482,359)])
}
Add(Hub,14777655,371,315)
{
link(onEvent1,4937507:doValue,[(408,321)(408,272)])
link(onEvent2,10620622:doFileHashsum,[])
}
Add(Memory,4937507,574,266)
{
@Hint=#57:На всякий случай храним здесь путь к тому самому файлу...|
@Color=43775
}
Add(DoData,8287601,574,315)
{
link(onEventData,9302323:doAdd,[])
link(Data,4937507:Value,[])
}
Add(InfoTip,13593913,616,245)
{
Info=#78:Вывод файлов-вирусов и их казнь, выбрав файл и вызвав меню правой кнопкой мыши|
Width=323
Height=158
}
Add(IndexToChanel,7163521,812,329)
{
link(onEvent2,3829072:doPopupHere,[])
}
Add(HintManager,724986,21,224)
{
Name="hm1"
Font=[Tahoma,8,0,8421504,1]
HintStyle=0
HintTrack=0
HintBackColor=16777215
}
Add(PointHint,5365162,266,357)
{
Info=#56:Как бы для всего этого дела организовать прогресс бар...|
Width=344
Height=25
}
Add(BoxDrawManager,11239863,21,259)
{
Name="bdm1"
Gradient=1
Gutter=1
SelComboEdit=1
}
Add(PopupMenuEx,3829072,854,336)
{
Menu=#19:Удалить файл вируса|
GutterLineOn=1
Font=[Tahoma,8,0,8421504,204]
Bitmaps=[]
AutoBackClrImg=1
link(MenuItemIdx,9231000:doDelete,[(891,342)(891,356)])
}
Add(FileTools,9231000,896,336)
{
DelToRecycle=1
link(FileName,9302323:String,[(902,324)(822,324)(822,386)(741,386)])
}
В файле хеш суммы сжатые по алгоритму Lzh. Количество хеш сумм файлов-вирусов - примерно 98тыс. По идее, количество распознаваемых вирусов ограничено лишь объемом жесткого диска, так что можно легко сделать программу добавляющую в файл hash.vdb новые хеш суммы.
Схему делал не для замены антивирусных сканеров, до коих моему очень далеко, а просто так, попробовать свои силы.
Версия HiAsm на которой рисовалась схема - 4.04 сборка 185 (альтернативная) + полное обновление с SVN, но использованы только компоненты, доступные в простой версии + полное обновление с SVN.
Надеюсь, я нормально описал схему и она не будет удалена из-за несоответствия с правилами размещения. Вроде я читал