Linux на страже Windows. Обзор и установка системы резервного копирования BackupPC Андрей Маркелов perldoc <имя модуля> #tar zxvf имя_архива.tar.gz // разархивируем исходники #perl Makefile.PL // формируем makefile #make // компилируем исходники #make test // после выполнения этой команды мы должны получить сообщение, что все тесты пройдены успешно #make install export LANG=en_US #tar zxvf par2cmdline-0.4.tar.gz #cd par2cmdline-0.4 #./configure #make #make check #make install #useradd backuppc #tar zxvf BackupPC-x.x.x.tar.gz #cd BackupPC-x.x.x #perl configure.pl #service backuppc start #chkconfig - -add backuppc #chkconfig - -level 35 backuppc on «print $Cgi->header();» «print $Cgi->header(-charset=>”koi8-r”);» «$s=~s{([^[:print:]])}{sprintf(“&\#x%02X;”, ord($1));}eg;» Роутер без диска Сергей Яремчук #/etc/rc.d/rc.inet1 #configsave /dev/fd0 #configrestore /dev/fd0 FreeBSD tips: устанавливаем VPN Сергей Супрунов # cd /usr/ports/net/mpd # make # make install #------------------- mpd.conf -------------------------- default: # Указываем, какую конфигурацию грузить (в принципе все параметры можно задать и непосредственно в секции default): load pptp0 pptp0: # Объявляем новый интерфейс ng0: new -i ng0 pptp0 pptp0 # Поскольку мы никуда не звоним, то устанавливать соединение по требованию не нужно: set iface disable on-demand # Разрешаем прохождение arp-запросов: set iface enable proxy-arp # Запрещаем разрывать связь при простое: set iface idle 0 # Ограничение на размер исходящих пакетов значением MTU: set iface enable tcpmssfix # Указываем, что наше соединение – не мультилинк: set bundle disable multilink # Требуем шифрование: set bundle yes crypt-reqd # Включаем компрессию: set bundle enable compression set link yes acfcomp protocomp # Разрешаем только chap-авторизацию: set link no pap chap set link enable chap # Интервалы проверки линка на «жизнеспособность»: set link keep-alive 10 60 # Размер «окна отсылки»: set link mtu 1460 # Разрешаем компрессию TCP-заголовка: set ipcp yes vjcomp # Следующий параметр задает диапазоны IP-адресов на стороне сервера и на стороне клиентов в виде set ipcp ranges local[/width] remote[/width] # В нашем случае серверу и клиенту назначается по одному адресу: set ipcp ranges 197.y.y.73 197.y.y.75 # Следующие четыре опции cpp определяют протоколы управления сжатием (compression control protocol) – для работы с Windows-клиентами. # Включаем поддержку сжатия MPPC (Microsoft Point-to-Point Compression): set ccp yes mppc # Поддержка 40-битного кодирования: set ccp yes mpp-e40 # Поддержка 128-битного кодирования: set ccp yes mpp-e128 # Stateless-режим, уменьшает время восстановления при сбросе (drop) пакета: set ccp yes mpp-stateless # Адрес, на котором VPN-сервер ждет соединения: set pptp self 10.х.х.254 # Разрешаем входящие соединения: set pptp enable incoming # Инициировать соединение со стороны mpd не нужно: set pptp disable originate #--------------------- mpd.links ----------------------- pptp0: set link type pptp #------------------- mpd.secret ------------------------ username "userpassword" * # /usr/local/etc/rc.d/mpd.sh start Взаимодействие shell-скриптов с пользователем посредством Zenity Андрей Уваров # zenity --error #! /usr/local/bin/perl do print `zenity --info --text "You may not enter real birth date" --title=birthday`; while(!($birthdate = `zenity --calendar --date-format=%d.%m.%y`)); `zenity --info --text "Your birth date is $birthdate" --title "Your Bitrh Date"`; #! /bin/sh ```zenity --entry --title "Run command" --text "Command:``` Windows XP Service Pack 2 глазами системного администратора Михаил Платов {путь к SP2}\ WindowsXP-KB835935-SP2-ENU.exe /u /x:c:\sp2 HKLM,"SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile","EnableFirewall",0x00010001,0 Bugtraq стр. 29 "CWD xxxxxxxxxxx..." "LIST xxxxxxxxxxx..." "STAT xxxxxxxxxxx..." Настраиваем соединение по выделенной линии [boot loader] timeout=3 default=multi(0)disk(0)rdisk(0)partition(2)\WINNT.PRO [operating systems] multi(0)disk(0)rdisk(0)partition(2)\WINNT.PRO="Microsoft Windows 2000 Professional RUS" /fastdetect /sos /bootlog multi(0)disk(0)rdisk(0)partition(2)\WINNT.SRV="Microsoft Windows 2000 Server" /fastdetect /sos /bootlog # cat /usr/local/minicom/etc/minirc.ttyS0 pr port /dev/ttyS0 pu baudrate 19200 pu bits 8 pu parity N pu stopbits 1 # minicom -o -8 ttyS0 AT&F&L1*M1&H3S38.3=1S20=3S18=3S35.1=1S10=020*E1*Q1M0L0 AT&F&L1*M0&H3S38.3=1S20=3S18=3S35.1=1S10=020*E1*Q1M0L0 tftp dgram udp wait root /usr/sbin/in.tftpd in.tftpd -s /home/anthony/tftpd -u anthony -c # kill -1 inetd # cat /usr/local/minicom/etc/minirc.cisco pr port /dev/ttyS1 pu baudrate 9600 pu bits 8 pu parity N pu stopbits 1 # minicom -o -8 cisco ! ! Last configuration change at 09:45:23 MSD Fri Jul 2 2004 by c2500b ! NVRAM config last updated at 09:45:37 MSD Fri Jul 2 2004 by c2500b ! version 12.0 service timestamps debug uptime service timestamps log uptime no service password-encryption ! hostname C2500 ! aaa new-model aaa authentication login vty local enable secret 5 $1$PlHE$4e7IsaMq52hH/93YAFsmo/ enable password c ! username c2500b password 0 cisco username user password 0 pass ! ! clock timezone MSK 3 clock summer-time MSD recurring last Sun Mar 2:00 last Sun Oct 2:00 ip subnet-zero no ip domain-lookup ip domain-name tmb ip name-server 1.2.3.200 ip name-server 1.2.3.128 ! ! process-max-time 200 ! interface Ethernet0 ip address 1.2.3.100 255.255.0.0 no ip directed-broadcast no cdp enable ! interface Serial0 no ip address no ip directed-broadcast shutdown no cdp enable ! interface Serial1 no ip address no ip directed-broadcast shutdown no cdp enable ! interface Group-Async0 description Leased Line Discipline for OutDoor Offices ip unnumbered Ethernet0 no ip directed-broadcast encapsulation ppp ip tcp header-compression passive async mode dedicated no cdp enable ppp authentication pap group-range 1 16 member 1 peer default ip address 1.2.3.11 member 2 peer default ip address 1.2.3.12 member 3 peer default ip address 1.2.3.13 member 4 peer default ip address 1.2.3.14 member 5 peer default ip address 1.2.3.15 member 6 peer default ip address 1.2.3.16 member 7 peer default ip address 1.2.3.17 member 8 peer default ip address 1.2.3.18 ! ip classless ip route 0.0.0.0 0.0.0.0 Ethernet0 no ip http server ! no cdp run banner login _Welcome to Cisco->Metaframe Gateway_ ! line con 0 exec-timeout 0 0 transport input none line 1 16 autoselect ppp modem InOut transport input all stopbits 1 speed 19200 flowcontrol hardware line aux 0 line vty 0 exec-timeout 0 0 password cisco linevty 1 4 ! ntpserver 1.2.3.128 end @Echo Off REM ======================================================= REM 'Cisco2RAS' service (Win2K Pro) REM Auto-connecting / disconnecting RAS engine REM Anton Borisov, a.borisov@tesv.tmb.ru REM 28 Jun 2004 REM ======================================================= set PINGTIMEOUT=2500 set LOG=%SystemRoot%\cisco2ras.log set ERR=%SystemRoot%\cisco2ras.err REM // 30 seconds lasts each cycle set TIME=30 REM // 8 seconds to raise new interface in Leased Line set TIMEDROP=8 REM // 15 seconds for new interface to establish connection set TIMEIF=15 set IFSTOP=rasdial CiscoHub /D set IFSTART=rasdial CiscoHub user pass set MyCMD=Cisco2RAS set PINGER=1.2.3.128 Echo ========[ %MyCMD% Service startup! ]======== >> %LOG% time /t >> %LOG% date /T >> %LOG% :1 echo Erasing statistics file %ERR% in this cycle del %ERR% ping %PINGER% -n 7 -w %PINGTIMEOUT% | find "TTL" || echo DOWN > %ERR% if exist %ERR% ( echo No Leased Line link found. STOP IFACE.... %IFSTOP% echo Sleeping %TIMEDROP% seconds before dropping ї IFACE one more time. sleep.exe %TIMEDROP% echo Dropping IFACE one more time. %IFSTOP% echo Sleeping %TIMEIF% seconds before Leased Line is set. sleep.exe %TIMEIF% echo Raising up IFACE once more time.... %IFSTART% echo _________start log________ >> %LOG% echo new IFACE is set ... >> %LOG% time /t >> %LOG% date /T >> %LOG% echo __________end log_________ >> %LOG% ) echo Sleeping %TIME% seconds in this turn; Sleep.exe %TIME% goto 1 REGEDIT [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ras.cmd] "Type"=dword:00000010 "Start"=dword:00000002 "ErrorControl"=dword:00000001 "ImagePath"="C:\\WINNT.PRO\\srvany.exe" "DisplayName"="Cisco2RAS" "ObjectName"="LocalSystem" "MyVersionSftw"="Cisco2RAS Service" "MyVersionInfo"="Auto-connecting / disconnecting RAS engine" "MyVersionMail"="Anton Borisov, a.borisov@tesv.tmb.ru" "MyVersionDate"="28 Jun 2004" "Description"="Auto-connecting / disconnecting RAS engine" "FailureActions"=hex:00,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,98,10,0e,00,01,00,00,00,e0,93,04,00,01,00,00,00,e0,93,04,00,00,00,00,00,00,00,00,00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ras.cmd\Parameters] "Application"="C:\\WINNT.PRO\\ras.cmd" [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ras.cmd\Enum] "0"="Root\\LEGACY_RAS.CMD\\0000" "Count"=dword:00000001 @Echo Off REM ======================================================= REM 'Cisco2RRAS' service REM Auto-connecting / disconnecting RRAS engine REM Anton Borisov, a.borisov@tesv.tmb.ru REM 28 Jun 2004 REM ======================================================= set PINGTIMEOUT=2000 set LOG=%SystemRoot%\cisco2rras.log set ERR=%SystemRoot%\cisco2rras.err REM // 30 seconds lasts each cycle set TIME=30 REM // 8 seconds to raise new interface in Leased Line set TIMEDROP=8 REM // 15 seconds for new interface to establish connection set TIMEIF=15 set IFSTOP=netsh interface set interface name = CiscoHub connect = DISCONNECT set IFSTART=netsh interface set interface name = CiscoHub connect = CONNECT set IFROUTE=netsh routing ip add persistentroute 192.168.0.0 255.255.0.0 CiscoHub set MyCMD=Cisco2RRAS set PINGER=192.168.0.100 Echo "========[ %MyCMD% Service startup! ]=======" >> %LOG% time /t >> %LOG% date /T >> %LOG% :1 echo "Erasing statistics file %ERR% in this cycle" del %ERR% ping %PINGER% -n 7 -w %PINGTIMEOUT% | find "TTL" || echo DOWN > %ERR% if exist %ERR% ( echo "No reliable route found. Dropping down IFACE...". %IFSTOP% echo "Sleeping %TIMEDROP% seconds before new IFACE is raised up". sleep.exe %TIMEDROP% echo "Sleeping %TIMEIF% seconds before Leased Line is set". sleep.exe %TIMEIF% echo "Establishing new route. Raising up IFACE...". %IFSTART% %IFROUTE% echo "_________start log________" >> %LOG% echo "new IFACE is set ... " >> %LOG% time /t >> %LOG% date /T >> %LOG% echo "__________end log_________" >> %LOG% ) echo "Sleeping %TIME% seconds in this turn"; Sleep.exe %TIME% goto 1 REGEDIT4 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\rras.cmd] "Type"=dword:00000010 "Start"=dword:00000002 "ErrorControl"=dword:00000001 "ImagePath"="C:\\WINNT.SRV\\srvany.exe" "DisplayName"="Cisco2RRAS" "ObjectName"="LocalSystem" "MyVersionSftw"="Cisco2RRAS Service" "MyVersionInfo"="Auto-connecting / disconnecting RRAS engine" "MyVersionMail"="Anton Borisov, a.borisov@tesv.tmb.ru" "MyVersionDate"="28 Jun 2004" "Description"="Auto-connecting / disconnecting RAS engine" "FailureActions"=hex:00,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,98,10,0e,00,01,00,00,00,e0,93,04,00,01,00,00,00,e0,93,04,00,00,00,00,00,00,00,00,00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\rras.cmd\Parameters] "Application"="C:\\WINNT.SRV\\rras.cmd" [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\rras.cmd\Enum] "0"="Root\\LEGACY_RRAS.CMD\\0000" "Count"=dword:00000001 "NextInstance"=dword:00000001 GRSecurity Кирилл Тихонов # emerge grsec-sources # emerge gradm # cd gradm-2.0 # make # make install # cd linux-2.4.26 # patch –Np1 –i ../grsecurity-2.0-2.4.26.patch # make menuconfig role named u role users g role_allow_ip IP/netmask role_allow_ip 192.168.1.0/24 role_transitions subject /bin/su { ...... } subject /bin/su:/bin/bash:/bin/cat { .......... } subject /usr/bin/sarg:/bin/bash { / r /bin h /bin/date x /bin/mkdir x /bin/rm x /dev/tty rw /dev/null rw ............................... } subject /bin/su o { /etc/passwd r /etc/shadow r -CAP_ALL } connect /<маска>:<начальный порт>-<конечный порт> <тип> <протокол> bind /<маска>:<начальный порт>-<конечный порт> <тип> <протокол> subject /bin/su o { /etc/passwd r /etc/shadow r -CAP_ALL connect disabled bind disabled } subject /usr/sbin/apache o { ........................................ connect 0.0.0.0/0:53 dgram udp bind 0.0.0.0/0:80 stream tcp } # gradm –F –L /var/log/grsec # gradm –F –L /var/log/grsec –O /etc/grsec/acl role default subject / { / h -CAP_ALL connect disabled bind disabled } role root uG subject / { / h /bin h ………………. } ……………….. # gradm –E # gradm –D role mysql u subject / { / h -CAP_ALL bind disabled connect disabled } subject /usr/sbin/mysqld o { / h /etc r /etc/grsec h /etc/mysql/my.cnf r /lib rx /proc/sys/kernel/version r /tmp rwcd /usr/lib rx /usr/share/zoneinfo r /usr/share/mysql r /var/run/mysqld w /var/lib/mysql rw /var/lib/mysql/* rw -CAP_ALL +CAP_SETGID +CAP_SETUID } subject /usr/bin/netams o { / /var rwc /var/log h /etc/ssh h /etc/grsec h /dev/grsec h /proc/kcore h /proc/sys h /etc/shadow h /etc/passwd h /dev/mem h /dev/kmem h /dev/port h /dev/log h -CAP_ALL +CAP_NET_ADMIN bind disabled connect disabled } role apache ul # gradm –E –L /var/log/grsec # gradm –D # gradm –L /var/log/grsec –O /etc/grsec/acl subject /bin/su lo { / h -CAP_ALL connect disabled bind disabled } role sysadmin sA subject / { / rwcdmxi +CAP_ALL } role_transitions sysadmin Восстановление данных на NTFS-разделах Крис Касперски Листинг 1. Интерфейс с IDE-диском в режиме CHS порт значение 0172/01F2 кол-во секторов 0173/01F3 номер сектора (биты 0-7) 0174/01F4 номер цилиндра (биты 0-7) 0175/01F5 номер цилиндра (биты 8-15) 0176/01F6 номер головки (биты 0-3), привод на шине (бит 4), режим CHS/LBA (бит 6) Листинг 2. Интерфейс с прерыванием INT13h BIOS регистр значение AL кол-во секторов для обработки CH номер цилиндра (биты 0-7) CL номер цилиндра (биты 6-7), номер сектора (биты 0-5) DH номер головки DL привод на шине | 80h Листинг 3. Интерфейс с IDE-диском в режиме LBA порт значение 0172/01F2 кол-во секторов 0173/01F3 номер сектора (биты 0-7) 0174/01F4 номер сектора (биты 8-15) 0175/01F5 номер сектора (биты 16-24) 0176/01F6 номер сектора (биты 24-28), привод на шине (бит 4), режим CHS/LBA (бит 6) Пакетные команды интерфейса ATAPI Владимир Мешков #define BSY 0x80 #define DRQ 0x08 #define DRDY 0x40 #define OUT_P_B(val,port) __asm__("outb %%al, %%dx"::"a"(val),"d"(port)) #define OUT_P_W(val,port) __asm__("outw %%ax, %%dx"::"a"(val),"d"(port)) #define IN_P_B(val,port) __asm__("inb %%dx, %%al":"=a"(val):"d"(port)) #define IN_P_W(val,port) __asm__("inw %%dx, %%ax":"=a"(val):"d"(port)) void send_packet_command(__u8 *cmd_buff) { int i; __u8 status = 0; __u16 port, a; port = 0x177; // регистр состояния SR /* В соответствии с алгоритмом ждем нулевого значения битов BSY и DRQ */ for(;;) { do { IN_P_B(status, port); } while(status & BSY); if(!(status & DRQ)) break; } /* Выбираем устройство Master и в его регистр команд записываем код пакетной команды */ port = 0x176; OUT_P_B(0xA0, port); // бит DEV сброшен port = 0x177; OUT_P_B(0xA0, port); /* Ждём сброса бита BSY и установки DRQ */ for(;;) { do { IN_P_B(status, port); } while(status & BSY); if(status & DRQ) break; } port = 0x170; // регистр данных /* Записываем в регистр данных переданный 12-байтный командный пакет (отметим одну особенность – если * записывать по одному байту, команда работать не будет) */ for(i = 0; i < 12; i += 2) { memcpy((void *)&a, (cmd_buff + i), 2); OUT_P_W(a, port); } port = 0x177; /* Ждём сброса бита BSY и установки DRDY */ for(;;) { do { IN_P_B(status, port); } while(status & BSY); if(status & DRDY) break; } return; } void wait_while_ready() { __u8 cmd_buff[12]; memset((void *)cmd_buff, 0, 12); cmd_buff[0] = 0x00; send_packet_command(cmd_buff); return; } void close_cdrom() { __u8 cmd_buff[12]; memset((void *)cmd_buff, 0, 12); cmd_buff[0] = 0x1B; // код команды START/STOP UNIT cmd_buff[4] = 0x3; // LoEj = 1, Start = 1 send_packet_command(cmd_buff); } void open_cdrom() { __u8 cmd_buff[12]; memset((void *)cmd_buff, 0, 12); cmd_buff[0] = 0x1B; cmd_buff[4] = 0x2; // LoEj = 1, Start = 0 send_packet_command(cmd_buff); } int main() { ioperm(0x170, 8, 1); /* Ждём готовности устройства и открываем лоток */ wait_while_ready(); open_cdrom(); printf("CD-ROM открыт. Нажмите 'Enter' для закрытия."); getchar(); /* Закрываем лоток */ close_cdrom(); wait_while_ready(); printf("OK. CD-ROM закрыт.\n"); ioperm(0x170, 8, 0); return 0; } void play_audio() { __u8 cmd_buff[12]; /* Воспроизводим фрагмент размером 5000 секторов, начиная с 10-го */ __u32 start_lba = 10; // стартовый сектор __u16 lba_len = 5000; // длина воспроизводимого участка memset((void *)cmd_buff, 0, 12); cmd_buff[0] = 0x45; // код команды PLAY AUDIO /* Меняем порядок следования байт при помощи макроса __swab32. Этот макрос определён в файле */ start_lba = __swab32(start_lba); memcpy((void *)(cmd_buff + 2), (void *)&start_lba, 4); lba_len = __swab16(lba_len); memcpy((void *)(cmd_buff + 6), (void *)&lba_len, 2); send_packet_command(cmd_buff); return; } int send_packet_data_command(__u16 data_len, __u8 *cmd_buff) { int i; __u8 status = 0; __u16 port, a; port = 0x177; /* Ожидаем сброса битов BSY и DRQ */ for(;;) { do { IN_P_B(status, port); } while(status & BSY); if(!(status & DRQ)) break; } /* Выбираем устройство Secondary Master */ port = 0x176; OUT_P_B(0xA0, port); /* В младший байт счетчика байтов (CL) заносим размер запрашиваемых данных */ port = 0x174; OUT_P_W(data_len, port); /* В регистр команд записываем код пакетной команды */ port = 0x177; OUT_P_B(0xA0, port); /* Ждём установки бита DRQ */ for(;;) { do { IN_P_B(status, port); } while(status & BSY); if(status & DRQ) break; } port = 0x170; /* В регистр данных записываем 12-байтный командный пакет */ for(i = 0; i < 12; i += 2) { memcpy((void *)&a, (cmd_buff + i), 2); OUT_P_W(a, port); } /* Ждём завершения команды - установленного бита DRQ. Если произошла ошибка - фиксируем этот факт */ port = 0x177; for(;;) { do { IN_P_B(status, port); } while(status & BSY); // ошибка выполнения команды! if(status & ERR) return -1; if(status & DRQ) break; } return 0; } int read_inquiry() { int i = 0; __u8 cmd_buff[12]; __u16 inquiry_buff[20]; // буфер для считываемых данных __u8 data_len = 40; // размер запрашиваемых данных memset(inquiry_buff, 0, 40); memset((void *)cmd_buff, 0, 12); cmd_buff[0] = 0x12; // код команды INQUIRY cmd_buff[4] = data_len; /* Посылаем устройству пакетную команду */ if(send_packet_data_command(data_len, cmd_buff) < 0) { printf("INQUIRY command error\n"); return -1; } /* Считываем результат и отображаем его */ for(i = 0; i < 20; i++) IN_P_W(inquiry_buff[i], 0x170); printf("%s\n", inquiry_buff + 4); return 0; } #define SECT_SIZE 2352 // размер RAW-сектора int read_cd(__u32 lba) { int i = 0, out_f, ret; __u8 cmd_buff[12]; __u8 buff[SECT_SIZE]; __u16 data_len = SECT_SIZE, a; memset((void *)buff, 0, sizeof(buff)); memset((void *)cmd_buff, 0, 12); /* Формируем командный пакет (рис. 8) */ cmd_buff[0] = 0xBE; // код команды READ CD cmd_buff[1] = 0; // считываем сектор любого типа (Any Type) cmd_buff[9] = 0xF8; // считываем всю информацию, находящуюся в секторе cmd_buff[8] = 1; // читаем один сектор /* Заполняем поле Starting Logical Block Address, при этом меняем порядок расположения байт */ lba = __swab32(lba); memcpy((cmd_buff + 2), (void *)&lba, 4); /* Посылаем устройству командный пакет */ if(send_packet_data_command(data_len, cmd_buff) < 0) { request_sense(); return -1; } /* Считываем результат и сохраняем его в файле */ for(i = 0; i < SECT_SIZE; i += 2) { IN_P_W(a, 0x170); memcpy((void *)(buff + i), (void *)&a, 2); } out_f = open("sector", O_CREAT|O_RDWR, 0600); write(out_f, buff, sizeof(buff)); return 0; } int request_sense() { int i = 0; __u8 cmd_buff[12]; __u8 sense_buff[14]; __u16 a; memset((void *)cmd_buff, 0, 12); memset((void *)sense_buff, 0, 14); /* Формируем пакетную команду REQUEST SENSE. Из блока sense data считываем первые 14 байт – этого нам хватит, чтобы определить * причину ошибки */ cmd_buff[0] = 0x3; cmd_buff[4] = 14; /* Посылаем устройству команду и считываем sense data */ if(send_packet_data_command(14, cmd_buff) < 0) exit(-1); for(i = 0; i < 14; i += 2) { IN_P_W(a, 0x170); memcpy((void *)(sense_buff + i), (void *)&a, 2); } printf("Sense key - 0x%X\n", sense_buff[2] & 0x0F); printf("ASC - 0x%X\n", sense_buff[12]); printf("ASCQ - 0x%X\n", sense_buff[13]); return 0; } 00 FF FF FF FF FF FF FF FF FF FF 00 00 15 25 01 LBA = ((Minute * 60 + Second) * 75 + Frame) – 150 struct toc { __u8 res; __u8 adr_cntl; __u8 trk_num; // номер трека __u8 res1; __u32 lba; // адрес сектора } __attribute__ ((packed)) *t; int read_toc() { #define PACKET_LEN 12 // длина пакетной команды #define READ_TOC 0x43 // код команды READ TOC #define MAX_TOC_LEN 804 // максимальная длина данных TOC (Format = 00b) int i = 0; int total_tracks = 0; __u8 cmd_buff[PACKET_LEN]; __u8 *data_buff; __u16 toc_length = 0, a; /* Формируем пакетную команду. Поле Starting Track содержит 0, по команде READ TOC будет выдана информация обо всех * треках диска, начиная с первого */ memset((void *)cmd_buff, 0, PACKET_LEN); cmd_buff[0] = READ_TOC; cmd_buff[6] = 0; /* Размер области памяти, выделенной для данных TOC */ a = MAX_TOC_LEN; a = __swab16(a); memcpy((void *)(cmd_buff + 7), (void *)&a, 2); data_buff = (__u8 *)malloc(MAX_TOC_LEN); memset(data_buff, 0, MAX_TOC_LEN); /* Посылаем устройству пакетную команду */ if(send_packet_data_command(MAX_TOC_LEN, cmd_buff) < 0) return -1; /* Считываем результат */ for(i = 0;;i += 2) { IN_P_W(a, 0x170); // размер данных TOC if(i == 0) toc_length = __swab16(a); if(i > toc_length) break; memcpy((void *)(data_buff + i), (void *)&a, 2); } /* Число треков на диске */ total_tracks = data_buff[3]; /* Отобразим результат */ printf("TOC length - %d\n", toc_length); printf("First: %d\t", data_buff[2]); printf("Last: %d\n", total_tracks); /* Выделим память и скопируем туда дескрипторы треков */ t = (struct toc *)malloc(toc_length); memcpy((void *)t, (data_buff + 4), toc_length); free(data_buff); /* Отобразим результаты */ for(i = 0; i < total_tracks; i++) printf("track: %d\tlba: %u\n", (i + 1), __swab32((t + i)->lba)); return 0; } struct toc { __u8 res; __u8 adr_cntl; __u8 trk_num; __u8 res1; __u32 lba; struct toc *next; // указатель на следующий элемент списка }; struct toc * read_toc() { #define READ_TOC 0x43 static int i = 1; int n; __u8 cmd_buff[12]; __u8 data_buff[12]; /* При каждом обращении к диску мы считываем 12 байт – 4 байта заголовка и 8 байт дескриптора трека, номер которого * задан в поле Starting Track */ __u16 buff_size = 12, a; struct toc *t; /* Если номер трека превысил 0xAA, выполнение функции прекращается */ if(i > 0xAA) return NULL; /* Выделяем память для дескриптора трека */ t = (struct toc *)malloc(sizeof(struct toc)); /* Формируем пакетную команду */ memset((void *)cmd_buff, 0, 12); cmd_buff[0] = READ_TOC; /* Поле Starting Track содержит номер трека. Этот номер увеличивается при каждом вызове функции */ cmd_buff[6] = i; /* Размер считываемых данных */ buff_size = __swab16(buff_size); memcpy((void *)(cmd_buff + 7), (void *)&buff_size, 2); /* Посылаем устройству пакетную команду */ if(send_packet_data_command(buff_size, cmd_buff) < 0) { printf("Error read TOC\n"); request_sense(); exit(-1); } /* Считываем данные – заголовок и дескриптор трека (рис. 12) */ memset(data_buff, 0, 12); for(n = 0; n < 12; n += 2) { IN_P_W(a, 0x170); memcpy((void *)(data_buff + n), (void *)&a, 2); } /* Отобразим размер данных TOC и номер первого и последнего трека */ if (i == 1) { memcpy((void *)&a, (void *)(data_buff), 2); printf("TOC lenght - %d\n", __swab16(a)); printf("First: %d\t", data_buff[2]); printf("Last: %d\n", data_buff[3]); max_track_num = data_buff[3]; } /* Копируем дескриптор трека в структуру struct toc */ memcpy((void *)t, (data_buff + 4), 8); t->lba = __swab32(t->lba); /* Считываем дескриптор следующего трека. Если треков больше нет, считываем дескриптор Lead-Out области последней сессии. */ i += 1; if(i == (max_track_num + 1)) i = 0xAA; t->next = read_toc(); return t; } void view_toc(struct toc *t) { if(t == NULL) return; if(t->trk_num == 0xAA) printf("lead out:\t"); else printf("track: %d\t", t->trk_num); printf("lba: %u\n", t->lba); view_toc(t->next); } struct toc_entry * get_toc_entry(int trk_num, struct toc *t) { struct toc_entry *t_entry; int i = 1; for(;i < trk_num; i++) t = t->next; t_entry = (struct toc_entry *) ї malloc(sizeof(struct toc_entry)); t_entry->start_lba = t->lba; t_entry->end_lba = t->next->lba; return t_entry; } struct toc_entry { __u32 start_lba; // стартовый адрес трека __u32 end_lba; // конечный адрес трека }; for(i = 0; i < 2352; i += 2) { IN_P_W(a, 0x170); a = __swab16(a); memcpy((void *)(buff + i), (void *)&a, 2); } # sox track.cdr track.wav # oggenc track.wav -b 256 track.ogg ioctl(int fd, CDROM_SEND_PACKET, struct cdrom_generic_command *); /* for CDROM_PACKET_COMMAND ioctl */ struct cdrom_generic_command { unsigned char cmd[CDROM_PACKET_SIZE]; unsigned char *buffer; unsigned int buflen; int stat; struct request_sense *sense; unsigned char data_direction; int quiet; int timeout; void *reserved[1]; }; #define CGC_DATA_WRITE 1 // передача данных устройству #define CGC_DATA_READ 2 // приём данных от устройства #define CGC_DATA_NONE 3 // нет обмена данными /* Файл open_close.c */ #include #include #include #include int main() { int fd; struct cdrom_generic_command cgc; /* Открываем файл устройства */ fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK); memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command)); /* Ждём готовность устройства к выполнению пакетной команды. Поле data_direction будет содержать CGC_DATA_NONE, т.к. * команда не требует передачи данных */ cgc.cmd[0] = GPCMD_TEST_UNIT_READY; // см. cgc.data_direction = CGC_DATA_NONE; /* Посылаем устройству команду */ ioctl(fd, CDROM_SEND_PACKET, &cgc); /* Формируем и посылаем устройству пакетную команду, выполняющую открытие лотка CD-ROM. Команда не требует * передачи данных, поле data_direction содержит CGC_DATA_NONE */ memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command)); cgc.cmd[0] = GPCMD_START_STOP_UNIT; cgc.cmd[4] = 0x2; cgc.data_direction = CGC_DATA_NONE; ioctl(fd, CDROM_SEND_PACKET, &cgc); printf("CD-ROM открыт. Нажмите ENTER для закрытия"); getchar(); /* Закрываем лоток */ memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command)); cgc.cmd[0] = GPCMD_START_STOP_UNIT; cgc.cmd[4] = 0x3; cgc.data_direction = CGC_DATA_NONE; ioctl(fd, CDROM_SEND_PACKET, &cgc); printf("CD-ROM закрыт\n"); return 0; } int read_cd(__u32 lba) { int fd, out_f; struct cdrom_generic_command cgc; struct request_sense sense; #define QSCH_LEN 16 // размер данных Q-субканала /* Буфер для считанных данных */ __u8 blk_buff[CD_FRAMESIZE_RAW + QSCH_LEN]; /* Открываем файл устройства */ fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK); /* Ожидаем готовность устройства к принятию пакетной команды */ memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command)); memset(&sense, 0, sizeof(sense)); cgc.cmd[0] = GPCMD_TEST_UNIT_READY; cgc.data_direction = CGC_DATA_NONE; cgc.sense = &sense; if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) { perror("ioctl"); printf("Sense key - 0x%02x\n", sense.sense_key); printf("ASC - 0x%02x\n", sense.asc); printf("ASCQ - 0x%02x\n", sense.ascq); return -1; } /* Формируем команду READ CD */ memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command)); memset(&sense, 0, sizeof(sense)); memset(blk_buff, 0, sizeof(blk_buff)); cgc.cmd[0] = GPCMD_READ_CD; cgc.cmd[1] = 0; // считывать сектор любого типа cgc.cmd[8] = 1; // считывать один сектор cgc.cmd[9] = 0xF8; // из сектора считывать все данные (табл. 99 INF-8010i) cgc.cmd[10] = 2; // считывать данные Q-субканала в общем потоке данных printf("lba - %d\n", lba); lba = __swab32(lba); memcpy((cgc.cmd + 2), (void *)&lba, 4); // направление данных – от устройства cgc.data_direction = CGC_DATA_READ; cgc.buffer = blk_buff; // указатель на буфер для данных cgc.buflen = CD_FRAMESIZE_RAW + QSCH_LEN; // размер буфера cgc.sense = &sense; /* Отправляем устройству команду */ if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) { perror("ioctl"); printf("Sense key - 0x%02x\n", sense.sense_key); printf("ASC - 0x%02x\n", sense.asc); printf("ASCQ - 0x%02x\n", sense.ascq); return -1; } /* Записываем в файл sector данные основного канала */ out_f = open("sector", O_CREAT|O_RDWR, 0600); write(out_f, blk_buff, CD_FRAMESIZE_RAW); /* В файл qsch - данные Q-субканала */ out_f = open("qsch", O_CREAT|O_RDWR, 0600); write(out_f, blk_buff + CD_FRAMESIZE_RAW, QSCH_LEN); /* Отобразим координаты сектора, находящиеся в заголовке * Header */ printf("Minute - %x\n", blk_buff[CD_SYNC_SIZE]); printf("Second - %x\n", blk_buff[CD_SYNC_SIZE + 1]); printf("Frame - %x\n", blk_buff[CD_SYNC_SIZE + 2]); printf("Mode - %d\n", blk_buff[CD_SYNC_SIZE + 3]); close(fd); close(out_f); return 0; } struct toc { __u8 snum; // номер сессии __u8 ctrl :4; // Control __u8 adr :4; // ADR __u8 tno; // номер трека (всегда 0) __u8 point; // POINT __u8 min; // AMIN __u8 sec; // ASEC __u8 frame; // AFRAME __u8 zero; // 0 __u8 pmin; // PMIN __u8 psec; // PSEC __u8 pframe; // PFRAME } __attribute__ ((packed)); int read_toc() { int i = 1; // буфер для хранения результатов чтения TOC __u8 *data_buff; /* Задаем размер области памяти для хранения данных ТОС. Т.к. заранее объем данных нам не известен, то зададим * маскимальное значение - 64 Кб */ __u16 buff_size = 0xFFFF; __u16 toc_data_length = 0; // длина записей TOC __u32 lba; int toc_entries = 0; // число записей в TOC struct cdrom_generic_command cgc; struct request_sense sense; struct toc *t; memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command)); memset(&sense, 0, sizeof(sense)); /* Выделяем память для содержимого TOC */ data_buff = (__u8 *)malloc(buff_size); memset(data_buff, 0, buff_size); /* Формируем пакетную команду для чтения TOC */ cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP; cgc.cmd[2] = 2; // поле Format Field = 10b cgc.sense = &sense; cgc.data_direction = CGC_DATA_READ; cgc.buffer = data_buff; cgc.buflen = buff_size; buff_size = __swab16(buff_size); memcpy((void *)(cgc.cmd + 7), (void *)&buff_size, 2); /* Посылаем командный пакет устройству */ if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) { perror("ioctl"); printf("Sense key - 0x%02x\n", sense.sense_key); printf("ASC - 0x%02x\n", sense.asc); printf("ASCQ - 0x%02x\n", sense.ascq); return -1; } /* Определяем размер данных TOC */ memcpy(&toc_data_length, data_buff, 2); toc_data_length = __swab16(toc_data_length); printf("TOC data length - %d\n", toc_data_length); /* Вычисляем число записей в содержимом TOC (cм. рис.13) */ toc_entries = (toc_data_length - 2)/11; printf("TOC entries - %d\n", toc_entries); /* Номер первой и последней сессии */ printf("First: %d\t", data_buff[2]); printf("Last: %d\n", data_buff[3]); /* Выделяем память для данных TOC, размер этих данных уже точно известен */ t = (struct toc *)malloc(toc_data_length); memset((void *)t, 0, toc_data_length); /* Копируем данные TOC из буфера data_buff и освобождаем выделенную под него память */ memcpy((void *)t, data_buff + 4, toc_data_length); free(data_buff); /* Отображаем результаты чтения TOC */ printf("Entry\tSession\tPoint\tMin\tSec\tFrame\tPMin\tPsec\tPFrame\tLBA\n"); for(i = 0; i < toc_entries; i++) { printf("%d\t", i); printf("%d\t", (t + i)->snum); printf("%X\t", (t + i)->point); printf("%d\t", (t + i)->min); printf("%d\t", (t + i)->sec); printf("%d\t", (t + i)->frame); printf("%d\t", (t + i)->pmin); printf("%d\t", (t + i)->psec); printf("%d\t", (t + i)->pframe); /* Пересчитываем координаты из MSF в LBA при помощи макроса MSF2LBA */ #define MSF2LBA(Min, Sec, Frame) \ (((Min * 60 + Sec) * 75 + Frame) - 150) lba = MSF2LBA((t + i)->pmin, (t + i)->psec, (t + i)->pframe); printf("%u\n", lba); } free(t); return 0; } # ./read_cd_full > toc int seek(__u32 lba) { struct cdrom_generic_command cgc; struct request_sense sense; memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command)); memset(&sense, 0, sizeof(sense)); /* Формируем пакетную команду */ cgc.cmd[0] = GPCMD_SEEK; // код команды SEEK (0x2B) cgc.sense = &sense; cgc.data_direction = CGC_DATA_NONE; // нет обмена данными /* Координаты сектора */ lba = __swab32(lba); memcpy((void *)(cgc.cmd + 2), (void *)&lba, 4); if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) { perror("ioctl"); printf("Sense key - 0x%02x\n", sense.sense_key); printf("ASC - 0x%02x\n", sense.asc); printf("ASCQ - 0x%02x\n", sense.ascq); return -1; } return 0; } struct current_position { __u8 dfc; // Data Format Code __u8 ctrl :4; // Control __u8 adr :4; // ADR __u8 tno; // Track number __u8 ino; // Index number __u32 a_addr; // Absolute CD-ROM Address __u32 r_addr; // Track Relative CD-ROM Address } __attribute__ ((packed)) cur_pos; void read_subch() { // размер запрашиваемых данных // (4 байта заголовка + 12 байт данных) __u16 buff_size = 16; // указатель на буфер для данных Q-субканала __u8 *data_buff; // размер блока данных Q-субканала __u16 sch_length = 0; struct cdrom_generic_command cgc; struct request_sense sense; memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command)); memset(&sense, 0, sizeof(struct request_sense)); /* Выделяем память */ data_buff = (__u8 *)malloc(buff_size); memset(data_buff, 0, buff_size); /* Формируем пакетную команду */ cgc.cmd[0] = GPCMD_READ_SUBCHANNEL; // код команды cgc.cmd[2] = 0x40; // бит SUBQ установлен – данные Q-субканала считываются cgc.cmd[3] = 1; // читаем данные о текущей позиции cgc.sense = &sense; cgc.data_direction = CGC_DATA_READ; // направление передачи данных cgc.buffer = data_buff; cgc.buflen = buff_size; buff_size = __swab16(buff_size); memcpy((void *)(cgc.cmd + 7), (void *)&buff_size, 2); if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) { perror("ioctl"); printf("Sense key - 0x%02x\n", sense.sense_key); printf("ASC - 0x%02x\n", sense.asc); printf("ASCQ - 0x%02x\n", sense.ascq); exit(-1); } /* Размер считанных данных */ memcpy(&sch_length, data_buff + 2, 2); sch_length = __swab16(sch_length); printf("Sub-channel data length - %d\n", sch_length); memset((void *)&cur_pos, 0, 12); memcpy((void *)&cur_pos, data_buff + 4, 12); printf("Data format code - %d\n", cur_pos.dfc); printf("ADR - %d\n", cur_pos.adr); printf("Track number - %d\n", cur_pos.tno); /* Текущая позиция оптического элемента */ cur_pos.a_addr = __swab32(cur_pos.a_addr); printf("Current position - %u\n", cur_pos.a_addr); /* Освобождаем память и выходим */ free(data_buff); return; } ioctl(fd, CDROMEJECT); // открыть лоток CD-ROM ioctl(fd, CDROMCLOSETRAY); // закрыть его #define CD_DEVICE "/dev/cdrom" int read_toc() { int fd, i; /* Структура struct cdrom_tochdr содержит заголовок содержимого TOC, структура struct cdrom_tocentry – дескриптор трека. * Обе структуры определены в файле */ struct cdrom_tochdr hdr; struct cdrom_tocentry toc; /* Открываем файл устройства */ fd = open(CD_DEVICE, O_RDONLY|O_NONBLOCK); /* Считываем заголовок TOC */ memset((void *)&hdr, 0, sizeof(struct cdrom_tochdr)); ioctl(fd, CDROMREADTOCHDR, &hdr); /* Поле cdth_trk0 структуры hdr содержит номер первого трека, а поле cdth_trk1 – номер последнего трека. Отобразим эти значения */ printf("First: %d\t", hdr.cdth_trk0); printf("Last: %d\n", hdr.cdth_trk1); #define FIRST hdr.cdth_trk0 #define LAST hdr.cdth_trk1 /* Определим формат, в котором мы хотим получить координаты трека. Для этого используется поле cdte_format структуры struct cdrom_tocentry */ toc.cdte_format = CDROM_LBA; /* Задавая в поле cdte_track структуры struct cdrom_tocentry последовательно номера треков от первого до последнего, * мы определяем их стартовые координаты в формате LBA */ for(i = FIRST; i <= LAST; i++) { toc.cdte_track = i; ioctl(fd, CDROMREADTOCENTRY, &toc); printf("track: %d\t", i); // номер трека // LBA адрес printf("lba: %d\n", toc.cdte_addr.lba); } return 0; } #define CD_DEVICE "/dev/cdrom" int main() { int fd, current_track; /* Координаты текущего сектора находятся в Q-субканале. Для чтения данных Q-субканала используется спецификатор CDROMSUBCHNL, * считанные данные помещаются в структуру struct cdrom_subchnl (см. ) */ struct cdrom_subchnl sc; /* Открываем файл устройства */ fd = open(CD_DEVICE, O_RDONLY|O_NONBLOCK); /* Проверяем тип компакт-диска. Это должен быть Audio-CD */ if(ioctl(fd, CDROM_DISC_STATUS) != CDS_AUDIO) { printf("I need Audio_CD!\n"); return 0; } /* Считывание координат производим в бесконечном цикле */ for(;;) { /* Задаём формат адреса LBA и считываем координаты сектора */ sc.cdsc_format = CDROM_LBA; ioctl(fd, CDROMSUBCHNL, &sc); current_track = sc.cdsc_trk; /* Отображаем данные о текущем треке и координате в формате LBA */ printf("Track: %d\t", current_track); printf("LBA: %d\t", sc.cdsc_absaddr.lba); /* То же самое - для формата MSF */ sc.cdsc_format = CDROM_MSF; ioctl(fd, CDROMSUBCHNL, &sc); printf("MSF: %d %d %d\n", sc.cdsc_absaddr.msf.minute, sc.cdsc_absaddr.msf.second, sc.cdsc_absaddr.msf.frame); /* Ждем две секунды и повторяем. Выход по Ctrl-C */ sleep(2); } return 0; } int read_cdda_track() { int fd, out, n; __u32 i, start_lba, end_lba; __u16 buff[CD_FRAMESIZE_RAW/2]; struct cdrom_tochdr hdr; struct cdrom_tocentry toc; /* Структура struct cdrom_read_audio используется вместе с IOCTL-командой CDROMREADAUDIO () */ struct cdrom_read_audio cda; /* Открываем устройство */ fd = open(CD_DEVICE, O_RDONLY|O_NONBLOCK); /* Определяем количество треков на Audio-CD */ memset((void *)&hdr, 0, sizeof(struct cdrom_tochdr)); ioctl(fd, CDROMREADTOCHDR, &hdr); printf("First: %d\t", hdr.cdth_trk0); printf("Last: %d\n", hdr.cdth_trk1); #define FIRST hdr.cdth_trk0 #define LAST hdr.cdth_trk1 /* Вводим номер трека, который мы собираемся считать, и проверяем правильность введенного значения */ printf("Enter track number: "); scanf("%d", &n); if((n < 1) || (n > LAST)) { printf("Wrong track number\n"); return -1; } /* Задаем формат адреса */ toc.cdte_format = CDROM_LBA; /* Определяем стартовый адрес трека (в LBA формате) */ toc.cdte_track = n; ioctl(fd, CDROMREADTOCENTRY, &toc); start_lba = toc.cdte_addr.lba; /* Конечный адрес трека. Если выбран последний трек на диске, то необходимо определить начало lead-out области. * Для этого в поле номера трека указываем 0xAA */ if(n == LAST) toc.cdte_track = CDROM_LEADOUT; else toc.cdte_track = n + 1; ioctl(fd, CDROMREADTOCENTRY, &toc); end_lba = toc.cdte_addr.lba; /* Считанный трек сохраним в файле track.cdr */ out = open("track.cdr",O_CREAT|O_RDWR,0600); /* Заполним поля структуры struct cdrom_read_audio */ cda.addr_format = CDROM_LBA; // формат адреса cda.nframes = 1; // сколько секторов считываем за одно обращение к диску cda.buf = (__u8 *)&buff[0]; // адрес буфера для считанных данных /* Цикл чтения секторов */ for(i = start_lba; i < end_lba; i++) { memset(buff, 0, sizeof(buff)); cda.addr.lba = i; // адрес считываемого сектора printf("lba: %u\n", i); /* Считываем сектор c аудиоданными и меняем местами соседние байты */ ioctl(fd, CDROMREADAUDIO, &cda); for(n = 0; n < CD_FRAMESIZE_RAW/2; n++) buff[n] = __swab16(buff[n]); /* Сохраняем считанный сектор в файл */ write(out, (__u8 *)buff, CD_FRAMESIZE_RAW); } close(fd); close(out); return 0; } # sox track.cdr track.wav # oggenc track.wav -q 6 track.ogg Bugtraq стр. 85

USERNAME:
NOME:
PASSWORD:
E-MAIL:






USERNAME:


if ( !empty($HTTP_GET_VARS['op']) ) { $op = $HTTP_GET_VARS['op']; } if ( !empty($HTTP_POST_VARS['op']) ) { $op = $HTTP_POST_VARS['op']; } Особенности запуска внешних команд из ASP-страниц Иван Коробко <%Script Language=”VBScript”%> <%Script Language=”JScript”%> Пример 1: <%@ Language=VBScript CODEPAGE=1251%> Заголовок страницы … <% … Response.write variable ‘ отображение на экране содержимого переменной %> Пример 2: Set Wshell = CreateObject("Wscript.shell") Set Proc = Wshell.Exec("application.exe") ' Ждать, пока не завершится выполнение программы Do While Proc.Status = 0 WScript.Sleep 100 Loop Set Wshell = Nothing MsgBox Proc.StdOut.ReadAll Пример 3: Set Wshell = CreateObject("Wscript.shell") Set Proc = Wshell.Run("application.exe") Set Wshell = Nothing MsgBox Proc %comspec% /c cmd_util.exe Пример 4: Set objArgs=Wscript.Arguments t=”Количество заданных параметров - ” & Wscript.Arguments.Count & chr(13) & “Параметры:” & chr(13) For Each arg in objArgs t = t & arg & chr(13) Next MsgBox t Пример 5: Set objArgs=Wscript.Arguments Coun = Wscript.Arguments.Count t="Количество заданных параметров - " & Coun & chr(13) & "Параметры:" & chr(13) For i=0 to Coun-1 t = t & i+1 & ": "& objArgs(i) & chr(13) Next MsgBox t Пример 6: Set objArgs=Wscript.Arguments Msgbox objArgs(2) ' Чтение третьего аргумента. Пример 7: Set objArgs=Wscript.Arguments Coun = Wscript.Arguments.Count q = InputBox (“Введите номер считываемого аргумента”, “Чтение номера аргумента”)-1 t = ”” if q> Coun then t= objArgs(q) else t=”ERROR” End if Msgbox t PHP 5 – пришествие неизбежно Кирилл Сухов name;     }     function setName($name) {         $this->name = $name;     }     function foo($name) {         $this->setName($name);     } } function changeName($person, $name) {     $foo->setName($name); } $person = new foo("Bill"); changeName($person, "John"); print $person->getName(); ?> message = $message; } $this->code = $code; $this->file = __FILE__; // of throw clause $this->line = __LINE__; // of throw clause $this->trace = debug_backtrace(); $this->string = StringFormat($this); } protected $message = 'Unknown exception'; // exception message protected $code = 0; // user defined exception code protected $file; // source filename of exception protected $line; // source line of exception private $trace; // backtrace of exception private $string; // internal only!! final function getMessage() { return $this->message; } final function getCode() { return $this->code; } final function getFile() { return $this->file; } ?> $client = new SoapClient(null, array( 'location' => "http://localhost/soap.php", 'uri' => "http://test-uri/", 'style' => SOAP_DOCUMENT, 'use' => SOAP_LITERAL)); $client = new SoapClient("some.wsdl"); \n"; } else {   while ($conn = stream_socket_accept($socket)) {    fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");    fclose($conn);   }   fclose($socket); } ?> name = "Sterling"; echo $c->name; ?>