home *** CD-ROM | disk | FTP | other *** search
/ ftp.sberbank.sumy.ua / 2014.11.ftp.sberbank.sumy.ua.tar / ftp.sberbank.sumy.ua / incoming / 1 / FileSplitter1.ASM < prev    next >
Assembly Source File  |  2014-02-08  |  15KB  |  575 lines

  1. ;File splitter
  2. ;The code below was written exclusively by
  3. ;Evgeney Victorovich Kupin Copyright (c) 21.06.2013
  4. ;www.kupin.net46.net
  5. ;It's free for any including commercial purposes
  6. ;You are absolutely free to do whatever you like
  7. ;with the code below
  8.  
  9.  
  10. format PE GUI 4.0
  11. entry start
  12.  
  13. include 'win32w.inc'
  14.  
  15.  
  16. MAX_DIVIDED_FILE_VALUE    =  1073741824
  17. MAX_ZERO_NUMBER     =  3
  18. MAX_DIVIDE_NUMBER    =  (1000 - 1)         ;-)))))))))
  19.  
  20.  
  21. IDR_MENU        =  10
  22. IDR_ICON_DATA        =  11
  23. IDR_ICON        =  12
  24. IDR_ABOUT_DIALOG    =  13
  25.  
  26. IDM_SPLIT        =  40
  27. IDM_MERGE        =  41
  28. IDM_EXIT        =  42
  29. IDM_ABOUT        =  43
  30.  
  31. IDD_ABOUT_OK        =  50
  32.  
  33. ID_DIV_NUMBER_EDIT    = 100
  34. ID_DIV_NUMBER_UP_DOWN = 101
  35. ID_DIV_NUMBER_STATIC  = 102
  36. ID_SPLIT_PUSH_BUTTON  = 103
  37. ID_MERGE_PUSH_BUTTON  = 104
  38.  
  39.  
  40. section '.idata' import data readable writeable
  41.  
  42.   library kernel32,'KERNEL32.DLL',\
  43.       user32,'USER32.DLL',\
  44.       comdlg32, 'comdlg32.dll',\
  45.       comctl32, 'comctl32.dll'
  46.  
  47.   include 'api\kernel32.inc'
  48.   include 'api\user32.inc'
  49.   include 'api\comdlg32.inc'
  50.   include 'api\comctl32.inc'
  51.  
  52. section '.data' data readable writeable
  53.  
  54.    WindowClass        TCHAR 'Win32FileSplitter',0
  55.    WindowTitle        TCHAR 'File splitter',0
  56.    EditClass        TCHAR 'EDIT',0
  57.    StaticClass        TCHAR 'STATIC',0
  58.    PushButtonClass    TCHAR 'BUTTON',0
  59.    UpDownClass        TCHAR 'msctls_updown32',0
  60.  
  61.    FilterString     TCHAR 'All',0,'*.*;',0,'Splited',0,'*.sld;',0,0
  62.  
  63.    FormatParamString    TCHAR '%s%s%d%s',0
  64.    PercentString    TCHAR '%s',0
  65.    PercentZeroString    TCHAR '%0',0
  66.    DecimalDString    TCHAR 'd',0
  67.  
  68.    FormatFileString    TCHAR '%s%02d',0
  69.    FileExtensionString    TCHAR '-zip-',0
  70.    AppendString     TCHAR '000000000',0
  71.    ExtensionString    TCHAR '.sld',0
  72.  
  73.    DividerValueString    TCHAR 'Divider value:',0
  74.    SplitButtonString    TCHAR 'Split',0
  75.    MergeButtonString    TCHAR 'Merge',0
  76.  
  77.    WindWidth   dd  226
  78.    WindHeight  dd  130
  79.  
  80.    wc WNDCLASSEX 0, CS_VREDRAW + CS_HREDRAW, WindowProc,0,0,\
  81.          NULL,NULL,NULL,COLOR_BTNFACE+1, NULL, WindowClass, 0
  82.    msg MSG
  83.  
  84. section '.bss' readable writeable
  85.  
  86.    hWnd         dd ?
  87.    hDivNumberEditWnd    dd ?
  88.    hDivNumberUpDownWnd    dd ?
  89.    hDivNumberStatic    dd ?
  90.    hSplitPushButton    dd ?
  91.    hMergePushButton    dd ?
  92.  
  93.    PosX dd ?
  94.    PosY dd ?
  95.  
  96.    dwZeroNumber     dd ?
  97.  
  98.    strOpenFile         OPENFILENAME     ?
  99.    cFileNameToBeSplited  TCHAR    256  dup(?)
  100.    cFileNameSplited     TCHAR    256  dup(?)
  101.    cMergedFileName     TCHAR    256  dup(?)
  102.    cDedugOutput      TCHAR    256  dup(?)
  103.  
  104. section '.text' code readable executable
  105.  
  106. OlderZeroCheck:
  107.     push    ebp
  108.     mov    ebp, esp
  109.     push    ebx esi edi
  110.  
  111.     invoke    lstrlen, cFileNameToBeSplited
  112.     shl    eax, 1
  113.     add    eax, cFileNameToBeSplited
  114.     sub    eax, 10
  115.  
  116.        push    edi
  117.     mov    edi, eax
  118.     std
  119.     mov    ecx, 10
  120.     mov    ax, WORD[FileExtensionString]
  121.     repne    scasw
  122.     cld
  123.     sub    ecx, 9
  124.     neg    ecx
  125.     mov    [dwZeroNumber], ecx
  126.        pop     edi
  127.  
  128.     invoke    wsprintf, FormatFileString, FormatParamString, PercentString,\
  129.         PercentZeroString, [dwZeroNumber], DecimalDString
  130.  
  131.     pop    edi esi ebx
  132.     leave
  133.     ret
  134.  
  135.  
  136. proc MergeFile
  137.  local hInputFile:DWORD, dwOutputFile:DWORD, dwBytesRead:DWORD,\
  138.        dwBytesWritten:DWORD, hFindFile:DWORD, dwFileNumber:DWORD,\
  139.        dwInputFileSize:DWORD, hGlobMem:DWORD, lpGlobMemPointer:DWORD,\
  140.        strFindData:WIN32_FIND_DATA
  141.  
  142.     push    ebx esi edi
  143.  
  144.     call OlderZeroCheck
  145.  
  146.     mov    [dwFileNumber], 0
  147.     lea    eax, [strFindData]
  148.     invoke    RtlZeroMemory, eax, 40
  149.  
  150.     invoke    lstrcpy, cMergedFileName, cFileNameToBeSplited
  151.     invoke    lstrlen, cMergedFileName
  152.     shl    eax, 1
  153.     add    eax, cMergedFileName
  154.     sub    eax, 18
  155.     mov    ecx, [dwZeroNumber]
  156.     shl    ecx, 1
  157.     sub    eax, ecx
  158.     mov    WORD[eax], '.'
  159.     mov    WORD[eax+8], 0
  160.  
  161.     invoke    CreateFile, cMergedFileName, GENERIC_WRITE,\
  162.               0, NULL, CREATE_ALWAYS,\
  163.               FILE_ATTRIBUTE_NORMAL, NULL
  164.     mov    [dwOutputFile], eax
  165.  
  166.     invoke    lstrlen, cFileNameToBeSplited
  167.     shl    eax, 1
  168.     add    eax, cFileNameToBeSplited
  169.     sub    eax, 8
  170.     mov    ecx, [dwZeroNumber]
  171.     shl    ecx, 1
  172.     sub    eax, ecx
  173.     mov    WORD[eax],0
  174.  
  175.     invoke    wsprintf, AppendString, FormatFileString+4, [dwFileNumber]
  176.     invoke    lstrcat, cFileNameToBeSplited, AppendString
  177.     invoke    lstrcat, cFileNameToBeSplited, ExtensionString
  178.  
  179. MERGE_FILE_PROC_LOOP:
  180.     lea    eax, [strFindData]
  181.     invoke    FindFirstFile, cFileNameToBeSplited, eax
  182.     mov    [hFindFile], eax
  183.     cmp    eax, INVALID_HANDLE_VALUE
  184.     je    MERGE_FILE_PROC_LOOP_EXIT
  185.  
  186.     invoke    CreateFile, cFileNameToBeSplited, GENERIC_READ,\
  187.               0, NULL, OPEN_EXISTING,\
  188.               FILE_ATTRIBUTE_NORMAL, NULL
  189.     mov    [hInputFile], eax
  190.  
  191.     invoke    GetFileSize, [hInputFile], NULL
  192.     mov    [dwInputFileSize], eax
  193.  
  194.     invoke    GlobalAlloc, GMEM_MOVEABLE+GMEM_ZEROINIT, [dwInputFileSize]
  195.     mov    [hGlobMem], eax
  196.     invoke    GlobalLock, [hGlobMem]
  197.     mov    [lpGlobMemPointer], eax
  198.  
  199.     lea    eax, [dwBytesRead]
  200.     invoke    ReadFile, [hInputFile], [lpGlobMemPointer], [dwInputFileSize],\
  201.             eax, NULL
  202.  
  203.     lea    eax, [dwBytesWritten]
  204.     invoke    WriteFile, [dwOutputFile], [lpGlobMemPointer], [dwBytesRead],\
  205.              eax, NULL
  206.  
  207.     invoke    lstrlen, cFileNameToBeSplited
  208.     shl    eax, 1
  209.     add    eax, cFileNameToBeSplited
  210.     sub    eax, 8
  211.     mov    ecx, [dwZeroNumber]
  212.     shl    ecx, 1
  213.     sub    eax, ecx
  214.     mov    WORD[eax],0
  215.  
  216.     inc    [dwFileNumber]
  217.     invoke    wsprintf, AppendString, FormatFileString+4, [dwFileNumber]
  218.     invoke    lstrcat, cFileNameToBeSplited, AppendString
  219.     invoke    lstrcat, cFileNameToBeSplited, ExtensionString
  220.  
  221.     invoke    GlobalUnlock, [hGlobMem]
  222.     invoke    GlobalFree, [hGlobMem]
  223.     invoke    CloseHandle, [hInputFile]
  224.  
  225.     invoke    FindClose, [hFindFile]
  226.     jmp    MERGE_FILE_PROC_LOOP
  227.  
  228. MERGE_FILE_PROC_LOOP_EXIT:
  229.     invoke    CloseHandle, [dwOutputFile]
  230.  
  231.     mov    [dwZeroNumber], MAX_ZERO_NUMBER
  232.     invoke    wsprintf, FormatFileString, FormatParamString, PercentString,\
  233.         PercentZeroString, [dwZeroNumber], DecimalDString
  234.     pop    edi esi ebx
  235.     ret
  236. endp
  237.  
  238. proc SplitFile
  239.  local hInputFile:DWORD, dwOutputFile:DWORD, dwBytesToCopy:DWORD,\
  240.        hGlobMem:DWORD, lpGlobMemPointer:DWORD, dwBytesRead:DWORD,\
  241.        dwBytesWritten:DWORD, dwDivNumber:DWORD, dwCutNumber:DWORD
  242.  
  243.     push    ebx esi edi
  244.  
  245.     invoke    lstrlen, cFileNameToBeSplited
  246.     shl    eax, 1
  247.     add    eax, cFileNameToBeSplited
  248.     sub    eax, 6
  249.     invoke    lstrcpy, FileExtensionString+2, eax
  250.     mov    WORD[FileExtensionString+8], '-'
  251.     mov    WORD[FileExtensionString+10], 0
  252.  
  253.     invoke    CreateFile, cFileNameToBeSplited, GENERIC_READ,\
  254.               0, NULL, OPEN_EXISTING,\
  255.               FILE_ATTRIBUTE_NORMAL, NULL
  256.     mov    [hInputFile], eax
  257.  
  258.     invoke    SendMessage, [hDivNumberUpDownWnd], UDM_GETPOS ,0 ,0
  259.     mov    [dwDivNumber], eax
  260.  
  261.     invoke    GetFileSize, [hInputFile], NULL
  262.     cmp    eax, MAX_DIVIDED_FILE_VALUE
  263.     ja    SPLIT_FILE_PROC_MAX_INPUT_SIZE_EXCEEDED
  264.  
  265.     xor    edx,edx
  266.     div    [dwDivNumber]
  267.     mov    [dwBytesToCopy], eax
  268.  
  269.     invoke    GlobalAlloc, GMEM_MOVEABLE+GMEM_ZEROINIT, [dwBytesToCopy]
  270.     mov    [hGlobMem], eax
  271.     invoke    GlobalLock, [hGlobMem]
  272.     mov    [lpGlobMemPointer], eax
  273.  
  274.     mov    [dwDivNumber], 0
  275.     mov    [dwCutNumber], 8
  276. SPLIT_FILE_PROC_WRITE_LOOP:
  277.     lea    eax, [dwBytesRead]
  278.     invoke    ReadFile, [hInputFile], [lpGlobMemPointer], [dwBytesToCopy],\
  279.             eax, NULL
  280.     cmp    [dwBytesRead], 0
  281.     je    SPLIT_FILE_PROC_WRITE_LOOP_EXIT
  282.  
  283.     invoke    lstrlen, cFileNameToBeSplited
  284.     shl    eax, 1
  285.     add    eax, cFileNameToBeSplited
  286.     sub    eax, [dwCutNumber]
  287.     mov    WORD[eax],0
  288.     push    DWORD[dwZeroNumber]
  289.     pop    DWORD[dwCutNumber]
  290.     shl    [dwCutNumber], 1
  291.     add    [dwCutNumber], 18
  292.  
  293.     invoke    wsprintf, AppendString, FormatFileString, FileExtensionString, [dwDivNumber]
  294.     inc    [dwDivNumber]
  295.     invoke    lstrcat, cFileNameToBeSplited, AppendString
  296.     invoke    lstrcat, cFileNameToBeSplited, ExtensionString
  297.  
  298.     invoke    CreateFile, cFileNameToBeSplited, GENERIC_WRITE,\
  299.               0, NULL, CREATE_ALWAYS,\
  300.               FILE_ATTRIBUTE_NORMAL, NULL
  301.     mov    [dwOutputFile], eax
  302.  
  303.     lea    eax, [dwBytesWritten]
  304.     invoke    WriteFile, [dwOutputFile], [lpGlobMemPointer], [dwBytesRead],\
  305.              eax, NULL
  306.  
  307.     invoke    CloseHandle, [dwOutputFile]
  308.  
  309.     mov    eax, [dwBytesToCopy]
  310.     cmp    [dwBytesWritten], eax
  311.     je    SPLIT_FILE_PROC_WRITE_LOOP
  312.  
  313. SPLIT_FILE_PROC_WRITE_LOOP_EXIT:
  314.  
  315.       ;  invoke  wsprintf, cDedugOutput, FormatString, [dwBytesRead]
  316.       ;  invoke  MessageBox, 0, cDedugOutput, 0, MB_OK
  317.  
  318.     invoke    GlobalUnlock, [hGlobMem]
  319.     invoke    GlobalFree, [hGlobMem]
  320.  
  321. SPLIT_FILE_PROC_MAX_INPUT_SIZE_EXCEEDED:
  322.     invoke    CloseHandle, [hInputFile]
  323.     pop    edi esi ebx
  324.     ret
  325. endp
  326.  
  327. proc AboutDialogProc hwnddlg,msg,wparam,lparam
  328.     push    ebx esi edi
  329.     cmp    [msg],WM_INITDIALOG
  330.     je    ABOUT_DIALOG_PROC_INIT
  331.     cmp    [msg],WM_COMMAND
  332.     je    ABOUT_DIALOG_PROC_COMMAND
  333.     cmp    [msg],WM_CLOSE
  334.     je    ABOUT_DIALOG_PROC_CLOSE
  335.     xor    eax,eax
  336.     jmp    ABOUT_DIALOG_PROC_FINISH
  337.  
  338.   ABOUT_DIALOG_PROC_INIT:
  339.  
  340.     jmp    ABOUT_DIALOG_PROC_PROCESSED
  341.  
  342.   ABOUT_DIALOG_PROC_COMMAND:
  343.     cmp    [wparam],BN_CLICKED shl 16 + IDD_ABOUT_OK
  344.     je    ABOUT_DIALOG_PROC_CLOSE
  345.     invoke    EndDialog,[hwnddlg],1
  346.     jmp    ABOUT_DIALOG_PROC_PROCESSED
  347.  
  348.   ABOUT_DIALOG_PROC_CLOSE:
  349.     invoke    EndDialog,[hwnddlg],0
  350.  
  351.   ABOUT_DIALOG_PROC_PROCESSED:
  352.     mov    eax,1
  353.  
  354.   ABOUT_DIALOG_PROC_FINISH:
  355.     pop    edi esi ebx
  356.     ret
  357. endp
  358.  
  359. start:
  360.     invoke    InitCommonControls
  361.  
  362.     invoke    GetModuleHandle,0
  363.     mov    [wc.hInstance],eax
  364.     mov    [wc.cbSize], 12*4
  365.     invoke    LoadIcon, [wc.hInstance], IDR_ICON
  366.     mov    [wc.hIcon],eax
  367.     invoke    LoadCursor,0,IDC_ARROW
  368.     mov    [wc.hCursor],eax
  369.     invoke    RegisterClassEx,wc
  370.     test    eax,eax
  371.     jz    START_END_LOOP
  372.  
  373.     invoke    GetSystemMetrics, SM_CXSCREEN
  374.     sub    eax, [WindWidth]
  375.     shr    eax, 1
  376.     mov    [PosX], eax
  377.  
  378.     invoke    GetSystemMetrics, SM_CYSCREEN
  379.     sub    eax, [WindHeight]
  380.     shr    eax, 1
  381.     mov    [PosY], eax
  382.  
  383.     invoke    LoadMenu, [wc.hInstance], IDR_MENU
  384.     invoke    CreateWindowEx, 0, WindowClass, WindowTitle,\
  385.         WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,\
  386.         [PosX], [PosY], [WindWidth], [WindHeight],\
  387.         NULL, eax, [wc.hInstance], NULL
  388.     test    eax,eax
  389.     jz    START_END_LOOP
  390.  
  391.     mov    [hWnd], eax
  392.     invoke    ShowWindow, [hWnd], SW_SHOWNORMAL
  393.     invoke    UpdateWindow, [hWnd]
  394.  
  395.   START_MSG_LOOP:
  396.     invoke    GetMessage ,msg, NULL,0,0
  397.     cmp    eax,1
  398.     jb    START_END_LOOP
  399.     jne    START_MSG_LOOP
  400.     invoke    TranslateMessage,msg
  401.     invoke    DispatchMessage,msg
  402.     jmp    START_MSG_LOOP
  403.  
  404.   START_END_LOOP:
  405.     invoke    ExitProcess,[msg.wParam]
  406.  
  407. proc WindowProc uses ebx esi edi, hwnd, wmsg, wparam, lparam
  408.  
  409.     cmp    [wmsg],WM_COMMAND
  410.     je    WIN_PROC_COMMAND
  411.     cmp    [wmsg],WM_DESTROY
  412.     je    WIN_PROC_DESTROY
  413.     cmp    [wmsg],WM_CREATE
  414.     je    WIN_PROC_CREATE
  415.  
  416.   WIN_PROC_DEFAULT:
  417.     invoke    DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
  418.     jmp    WIN_PROC_FINISH
  419.  
  420.   WIN_PROC_CREATE:
  421.     mov    [dwZeroNumber], MAX_ZERO_NUMBER
  422.  
  423.     invoke    wsprintf, FormatFileString, FormatParamString, PercentString,\
  424.         PercentZeroString, [dwZeroNumber], DecimalDString
  425.  
  426.     mov    [strOpenFile.lStructSize], sizeof.OPENFILENAME
  427.     push    [hwnd]
  428.     pop    [strOpenFile.hwndOwner]
  429.     mov    [strOpenFile.lpstrFilter], FilterString
  430.     mov    [strOpenFile.nFilterIndex], 1
  431.     mov    [strOpenFile.lpstrFile], cFileNameToBeSplited
  432.     mov    [strOpenFile.nMaxFile], 256
  433.     mov    [strOpenFile.Flags], OFN_EXPLORER+OFN_PATHMUSTEXIST+\
  434.             OFN_LONGNAMES+OFN_FILEMUSTEXIST+OFN_CREATEPROMPT
  435.  
  436.     invoke    CreateWindowEx, WS_EX_CLIENTEDGE, EditClass, 0,\
  437.               WS_VISIBLE + WS_CHILD + ES_NUMBER, 145, 10,\
  438.               50, 25, [hwnd], ID_DIV_NUMBER_EDIT,\
  439.               [wc.hInstance], NULL
  440.     mov    [hDivNumberEditWnd], eax
  441.  
  442.     invoke    CreateWindowEx, 0, UpDownClass, 0,\
  443.               WS_VISIBLE + WS_CHILD + UDS_SETBUDDYINT,\
  444.               195, 10, 30, 25, [hwnd], ID_DIV_NUMBER_UP_DOWN,\
  445.               [wc.hInstance], NULL
  446.     mov    [hDivNumberUpDownWnd], eax
  447.     invoke    SendMessage, [hDivNumberUpDownWnd], UDM_SETBUDDY,\
  448.             [hDivNumberEditWnd], 0
  449.  
  450.     mov    ax, 2
  451.     shl    eax, 16
  452.     mov    ax, MAX_DIVIDE_NUMBER
  453.     invoke    SendMessage, [hDivNumberUpDownWnd], UDM_SETRANGE, 0, eax
  454.     invoke    SendMessage, [hDivNumberUpDownWnd], UDM_SETPOS, 0, 00002h
  455.  
  456.     invoke    CreateWindowEx, WS_EX_STATICEDGE, StaticClass,\
  457.               DividerValueString,\
  458.               WS_VISIBLE + WS_CHILD + SS_SIMPLE, 10, 10,\
  459.               130, 25, [hwnd], ID_DIV_NUMBER_STATIC,\
  460.               [wc.hInstance], NULL
  461.     mov    [hDivNumberStatic], eax
  462.  
  463.     invoke    CreateWindowEx, 0, PushButtonClass, SplitButtonString,\
  464.               WS_VISIBLE + WS_CHILD + BS_DEFPUSHBUTTON, 10, 45,\
  465.               98, 30, [hwnd], ID_SPLIT_PUSH_BUTTON,\
  466.               [wc.hInstance], NULL
  467.     mov    [hSplitPushButton], eax
  468.  
  469.     invoke    CreateWindowEx, 0, PushButtonClass, MergeButtonString,\
  470.               WS_VISIBLE + WS_CHILD + BS_DEFPUSHBUTTON, 113, 45,\
  471.               98, 30, [hwnd], ID_MERGE_PUSH_BUTTON,\
  472.               [wc.hInstance], NULL
  473.     mov    [hMergePushButton], eax
  474.  
  475.     xor    eax, eax
  476.     jmp    WIN_PROC_FINISH
  477.  
  478.   WIN_PROC_COMMAND:
  479.     mov    eax, [wparam]
  480.     and    eax, 0ffffh
  481.     cmp    eax, ID_SPLIT_PUSH_BUTTON
  482.     je    WIN_PROC_SPLIT
  483.     cmp    eax, IDM_SPLIT
  484.     je    WIN_PROC_SPLIT
  485.     cmp    eax, ID_MERGE_PUSH_BUTTON
  486.     je    WIN_PROC_MERGE
  487.     cmp    eax, IDM_MERGE
  488.     je    WIN_PROC_MERGE
  489.     cmp    eax, IDM_ABOUT
  490.     je    WIN_PROC_ABOUT
  491.     cmp    eax, IDM_EXIT
  492.     je    WIN_PROC_DESTROY
  493.     jmp    WIN_PROC_DEFAULT
  494.  
  495.   WIN_PROC_SPLIT:
  496.     invoke    GetOpenFileName, strOpenFile
  497.     test    eax, eax
  498.     jz    WIN_PROC_FINISH
  499.     stdcall SplitFile
  500.     jmp    WIN_PROC_FINISH
  501.  
  502.   WIN_PROC_MERGE:
  503.     invoke    GetOpenFileName, strOpenFile
  504.     test    eax, eax
  505.     jz    WIN_PROC_FINISH
  506.     stdcall MergeFile
  507.     jmp    WIN_PROC_FINISH
  508.  
  509.   WIN_PROC_ABOUT:
  510.     invoke    DialogBoxParam, [wc.hInstance], IDR_ABOUT_DIALOG,\
  511.               [hwnd], AboutDialogProc, 0
  512.     jmp    WIN_PROC_FINISH
  513.  
  514.   WIN_PROC_DESTROY:
  515.     invoke    PostQuitMessage, 0
  516.     xor    eax,eax
  517.  
  518.   WIN_PROC_FINISH:
  519.     ret
  520. endp
  521.  
  522. section '.rsrc' resource data readable
  523.  
  524.   ; resource directory
  525.  
  526.   directory RT_MENU,menus,\
  527.         RT_ICON,icons,\
  528.         RT_GROUP_ICON,group_icons,\
  529.         RT_DIALOG,dialogs,\
  530.         RT_VERSION,versions
  531.  
  532.   ; resource subdirectories
  533.  
  534.   resource menus,\
  535.        IDR_MENU ,LANG_ENGLISH+SUBLANG_DEFAULT,main_menu
  536.  
  537.   resource icons,\
  538.        IDR_ICON_DATA ,LANG_NEUTRAL,icon_data
  539.  
  540.   resource group_icons,\
  541.        IDR_ICON ,LANG_NEUTRAL,main_icon
  542.  
  543.   resource dialogs,\
  544.        IDR_ABOUT_DIALOG ,LANG_ENGLISH+SUBLANG_DEFAULT,demonstration
  545.  
  546.   resource versions,\
  547.        1,LANG_NEUTRAL,version
  548.  
  549.   menu main_menu
  550.        menuitem '&File',0,MFR_POPUP
  551.         menuitem '&Split', IDM_SPLIT
  552.         menuitem 'Merge', IDM_MERGE
  553.         menuseparator
  554.         menuitem 'E&xit', IDM_EXIT,MFR_END
  555.        menuitem '&Help',0,MFR_POPUP + MFR_END
  556.         menuitem '&About...', IDM_ABOUT,MFR_END
  557.  
  558.   icon main_icon,icon_data,'Splitter.ico'
  559.  
  560.   dialog demonstration,'About',5,5,170,50,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
  561.     dialogitem 'STATIC',IDR_ICON, -1, 5,5,70,8,WS_VISIBLE+SS_ICON
  562.     dialogitem 'STATIC','File split and merge utility',-1,35,5,90,8,WS_VISIBLE
  563.     dialogitem 'STATIC','File splitter 1.0.3',-1,48,15,70,8,WS_VISIBLE
  564.     dialogitem 'STATIC','Copyright (C) 21.06.2013',-1,35,25,100,8,WS_VISIBLE
  565.     dialogitem 'STATIC','Evgeney Kupin',-1,50,35,70,8,WS_VISIBLE
  566.     dialogitem 'BUTTON','OK',IDD_ABOUT_OK,120,30,45,15,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
  567.   enddialog
  568.  
  569.   versioninfo version,VOS__WINDOWS32,VFT_APP,VFT2_UNKNOWN,LANG_ENGLISH+SUBLANG_DEFAULT,0,\
  570.           'FileDescription','File splitter 1.0.3',\
  571.           'LegalCopyright','It is free from www.net46.net, Evgeney Kupin',\
  572.           'FileVersion','1.0.3',\
  573.           'ProductVersion','1.0.3',\
  574.           'OriginalFilename','FileSplitter.exe'
  575.