8/13/2008

C# 获取路径

string str1 =Process.GetCurrentProcess().MainModule.FileName;//可获得当前执行的exe的文件名。
string str2=Environment.CurrentDirectory;//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
//备注 按照定义,如果该进程在本地或网络驱动器的根目录中启动,则此属性的值为驱动器名称后跟一个尾部反斜杠(如“C:\”)。如果该进程在子目录中启动,则此属性的值为不带尾部反斜杠的驱动器和子目录路径(如“C:\mySubDirectory”)。
string str3=Directory.GetCurrentDirectory();//获取应用程序的当前工作目录。
string str4=AppDomain.CurrentDomain.BaseDirectory;//获取基目录,它由程序集冲突解决程序用来探测程序集。
string str5=Application.StartupPath;//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。(如:D:\project\集团客户短信服务端\bin\Debug)
string str6=Application.ExecutablePath;//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str7=AppDomain.CurrentDomain.SetupInformation.ApplicationBase;//获取或设置包含该应用程序的目录的名称。

5/28/2008

虚拟机

1. VMware workstation vs virtual PC vs Bochs
(1) Bochs : emulates the x86 hardware and some of its peripherals
+ easily portable among a number of platforms & architectures
+ better choice for kernel or complier development
+ runs under all the platforms supported by VMware and Virtual PC and many additional platforms, including *BSD and BeOS.
- the slowest of the three due to emulation
+ only 2 MB
(2) Virtual PC : Some large parts of VirtualPC 4.03 for x86 are emulated, while other parts are virtualized. VirtualPC 5 under Macintosh is 100% emulator.
* In the middle of the others.
+ better choice for application targetting the end-user and the larger corporations
* runs on Windows 9x/ME and with different binaries also runs under NT/2k/XP, OS/2 and MacOS 9/X
- about 20MB
(3) VMware workstation : only emulates certain I/O functions,the rest is all executed through its x86 runtime engine via virtulization.
+ fast speed
+ better choice for application targetting the enterprise and large software houses
- poor portablity
* run on Windows 2000/XP and on Linux
- about 20MB

2. Virtual box
3. qemu
4. 。。

5/24/2008

.Net_linux

http://www.35dx.com/html/dotNet/2/net2934.html

ubuntu 下运行照样可以原生的迅雷

具体过程如下:
一、安装wine
wine 是Linux 下运行windows 程序的必需工具,Windows的程序都是在Wine 提供的环境中运行的。有两种方法安装:1) 通过网络安装 2) 下载安装包离线安装
1、网络安装
打开终端,运行如下命令,取得密钥:
wget -q http://wine.budgetdedicated.com/apt/387EE263.gpg -O- | sudo apt-key add -
后再输入以下指令,获得Wine的apt列表for Gutsy,其它发行版的请见这里:
sudo wget http://wine.budgetdedicated.com/apt/sources.list.d/gutsy.list -O /etc/apt/sources.list.d/winehq.list
安装包有10.8M,得等一阵子。这些都做完以后,再输入下面指令进行更新和升级:
sudo apt-get update
sudo apt-get dist-upgrade
2、下载安装包离线安装
访问:http://wine.budgetdedicated.com/,然后把相应的deb包下载下来(wine_0.9.57~winehq0~ubuntu~7.10-1_i386.deb),下载下来后。可以有三种方法安装:

1) 终端下执行 suod dpkg -i wine_0.9.57~winehq0~ubuntu~7.10-1_i386.deb
2)将deb 文件放进/var/cache/apt/archives 里,然后执行sudo apt-get dist-upgrade
3) 如果你闲麻烦直接把下载来的包双击安装也可以。
二、配置wine
终端下,执行
sudo winecfg
打开配置界面,先看看Application页:

在Windows Version 处选择要模拟的版本。选择相应的版本后,还需要把Windows 下的几个动态库手工copy到~/.wine/drive_c/windows/system32目录下。
sudo mkdir /mnt/c
sudo mount /dev/sda1 /mnt/c
sudo cp /mnt/c/windows/system32/mfc42.dll ~/.wine/drive_c/windows/system32
sudo cp /mnt/c/windows/system32/msvcp60.dll ~/.wine/drive_c/windows/system32
sudo cp /mnt/c/windows/system32/msvcrt.dll ~/.wine/drive_c/windows/system32
sudo cp /mnt/c/windows/system32/msvcirt.dll ~/.wine/drive_c/windows/system32

再看看Drivers页:

虚拟了两个盘:c盘和Z盘,但z盘链接到根/上。还可以自己增加盘符。
再看看Desktop Integration页:

可以安装主题,也可以修改我的文档对应的路径。修改后,按确定。
wine 的工作环境在~/.wine/目录下,这是个隐藏目录,见下图:

driver_c 就相当于Windows下的C盘,下面有windows 和program files 子目录。*.reg 文件就是注册表。dosdevices 目录下有两个链接:一个指向drive_c, 一个指向/,就是在winecfg 的Drivers 页看到的两个盘符。

配置wine 支持中文:
在终端中,执行如下命令:
cd ~/.wine
sudo gedit system.reg
在system.reg 中查找FontSubstitutes,找到

[Software\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes] 1205592459
"Arial"="simsun"
"Arial CE,238"="simsun"
......
"Tms Rmn"="simsun"

将这个部分下的内容替换为:
"Arial"="simsun"
"Arial CE,238"="simsun"
"Arial CYR,204"="simsun"
"Arial Greek,161"="simsun"
"Arial TUR,162"="simsun"
"Courier New"="simsun"
"Courier New CE,238"="simsun"
"Courier New CYR,204"="simsun"
"Courier New Greek,161"="simsun"
"Courier New TUR,162"="simsun"
"FixedSys"="simsun"
"Helv"="simsun"
"Helvetica"="simsun"
"MS Sans Serif"="simsun"
"MS Shell Dlg"="simsun"
"MS Shell Dlg 2"="simsun"
"System"="simsun"
"Tahoma"="simsun"
"Times"="simsun"
"Times New Roman CE,238"="simsun"
"Times New Roman CYR,204"="simsun"
"Times New Roman Greek,161"="simsun"
"Times New Roman TUR,162"="simsun"
"Tms Rmn"="simsun"

保存退出即可。

三、安装迅雷
我试过迅雷最新版 Thunder5.7.7.441,未成功,安装到最后,报异常崩溃。
又试过迅雷 Thunder5.6.8.329,同样报异常崩溃。最后试迅雷 Thunder5.5.6.274,成功。
迅雷 Thunder5.5.6.274,是最后一个不支持BT的版本,后续新版本增加了BT,EMule下载的支持。难道是BT惹的祸?!!
具体安装如下:
下载Thunder5.5.6.274.exe ,然后在终端中切换到下载目录下,执行:
sudo wine Thunder5.5.6.274.exe
出现迅雷5的安装界面,和Windows 下一样,一路装下去。
装完后,在屏幕最上面的工具条中,选择Application->其他->启动迅雷5,看,出现了迅雷5的界面了吧。
如果没有找到菜单,或者启动没有成功,可以通过命令行方式启动:
sudo cd ~/.wine/drive_c/Program\ Files/Thunder\ Network/Thunder
sudo wine Thunder.exe


然后,选择工具->配置,设置下载目录等各种参数。
这种方式安装后,迅雷是不能和FireFox 集成的。因此,在FireFox中复制URL, 在迅雷中,点新建按钮,将URL 粘贴进去,即可享受高速下载的乐趣。
网上已经有很多文章介绍在Linux下如何用wine 来运行迅雷,但是,这些讲的都是迅雷国际版,这个版本没有使用盗链技术,当下载的URL失效时,就无法再下载。这和Windows 下原生的迅雷,差了一大截。因此本文就是介绍在Linux 下如何运行原生的迅雷程序。

Ubuntu Start 安装

http://hi.baidu.com/zlovez/blog/item/3d99ff1fac127ff1e0fe0bd3.html

5/21/2008

iptables 介绍

iptables 中的指令,均需区分大小写。

ipchains 和 iptables 在语法上的主要的差异,注意如下∶
1. 在 ipchains 中,诸如 input 链,是使用小写的 chains 名,在 iptables 中,要改用大写 INPUT。
2. 在 iptables 中,要指定规则是欲作用在那一个规则表上(使用 -t 来指定,如 -t nat),若不指定,则预设是作用在 filter 这个表。
3. 在 ipchains 中, -i 是指介面(interface),但在 iptables 中,-i 则是指进入的方向,且多了 -o,代表出去的方向。
4. 在 iptables 中,来源 port 要使用关键字 --sport 或 --source-port
5. 在 iptables 中,目的 port 要使用关键字 --dport 或 --destination-port
6. 在 iptables 中,"丢弃" 的处置动作,不再使用 DENY 这个 target,改用 DROP。
7. 在 ipchains 的记录档功能 -l,已改为目标 -j LOG,并可指定记录档的标题。
8. 在 ipchains 中的旗标 -y,在 iptables 中可用 --syn 或 --tcp-flag SYN,ACK,FIN SYN
9. 在 iptables 中,imcp messages 型态,要加上关键字 --icmp-type,如∶
iptables -A OUTPUT -o eth0 -p icmp -s $FW_IP --icmp-type 8 -d any/0 -j ACCEPT




iptables 使用时的样板
在设定 iptables 的封包过滤规则时,有几个样板的动作,若先熟悉它们,往后就可自行套用,依此类推,很快地,您就可以进入这个天地之中。

观察目前的设定
作法如下∶

iptables -L -n
iptablse -t nat -L -n





定义变数
FW_IP="163.26.197.8"



打开核心 forward 功能
作法如下∶

###-----------------------------------------------------###
# 打开 forward 功能
###-----------------------------------------------------###

echo "1" > /proc/sys/net/ipv4/ip_forward




清除所有的规则
一开始要先清除所有的规则,重新开始,以免旧有的规则影响新的设定。作法如下∶

###-----------------------------------------------------###
# 清除先前的设定
###-----------------------------------------------------###
# 清除预设表 filter 中,所有规则链中的规则
iptables -F
# 清除预设表 filter 中,使用者自订链中的规则
iptables -X

# 清除mangle表中,所有规则链中的规则
iptables -F -t mangle
# 清除mangle表中,使用者自订链中的规则
iptables -t mangle -X

# 清除nat表中,所有规则链中的规则
iptables -F -t nat
# 清除nat表中,使用者自订链中的规则
iptables -t nat -X




选定预设的政策
接着,要选定各个不同的规则链,预设的政策为何。作法如下∶

预设全部丢弃∶

###-----------------------------------------------------###
# 设定 filter table 的预设政策
###-----------------------------------------------------###
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP




或者预设全部接受∶

###-----------------------------------------------------###
# 设定 filter table 的预设政策
###-----------------------------------------------------###
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT




各个规则链的预设政策可独立自主的设定,不必受其它链的影响。

以下练习,若目标为 DROP,则 policy 请设为 ACCEPT;若目标为 ACCEPT,则 policy 请设为 DROP,如此方可看出效果。

开放某一个介面
作法如下∶

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

注∶IPFW 或 Netfilter 的封包流向,local process 不会经过 FORWARD Chain,
因此 lo 只在 INPUT 及 OUTPUT 二个 chain 作用。

iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT




IP 伪装
使内部网路的封包经过伪装之后,使用对外的 eth0 网卡当作代表号,对外连线。作法如下∶

###-----------------------------------------------------###
# 启动内部对外转址
###-----------------------------------------------------###

iptables -t nat -A POSTROUTING -o eth0 -s 172.16.0.0/16 -j SNAT --to-source $FW_IP




上述指令意指∶把 172.16.0.0/16 这个网段,伪装成 $FW_IP 出去。

虚拟主机
利用转址、转 port 的方式,使外部网路的封包,可以到达内部网路中的伺服主机,俗称虚拟主机。这种方式可保护伺服主机大部份的 port 不被外界存取,只开放公开服务的通道(如 Web Server port 80),因此安全性甚高。

作法如下∶

###-----------------------------------------------------###
# 启动外部对内部转址
###-----------------------------------------------------###
# 凡对 $FW_IP:80 连线者, 则转址至 172.16.255.2:80
iptables -t nat -A PREROUTING -i eth0 -p tcp -d $FW_IP --dport 80 -j DNAT --to-destination 172.16.255.2:80




开放内部主机可以 telnet 至外部的主机
开放内部网路,可以 telnet 至外部主机。

作法如下∶(预设 policy 为 DROP)

###-----------------------------------------------------###
# open 外部主机 telnet port 23
###-----------------------------------------------------###

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 23 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 23 -d $FW_IP --dport 1024:65535 -j ACCEPT




开放邮包转递通道
开放任意的邮件主机送信包给你的 Mail Server,而你的 Mail Server 也可以送信包过去。

作法如下∶(预设 policy 为 DROP)

###-----------------------------------------------------###
# open SMTP port 25
###-----------------------------------------------------###

# 以下是∶别人可以送信给你
iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 1024:65535 -d $FW_IP --dport 25 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 25 -d any/0 --dport 1024:65535 -j ACCEPT

# 以下是∶你可以送信给别人
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 25 -d $FW_IP --dport 1024:65525 -j ACCEPT




开放对外离线下载信件的通道
开放内部网路可以对外部网路的 POP3 server 取信件。

作法如下∶(预设 policy 为 DROP)

###-----------------------------------------------------###
# open 对外部主机的 POP3 port 110
###-----------------------------------------------------###

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 110 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 110 -d $FW_IP --dport 1024:65535 -j ACCEPT




开放观看网页的通道
开放内部网路可以观看外部网路的网站。

作法如下∶(预设 policy 为 DROP)

###-----------------------------------------------------###
# open 对外部主机的 HTTP port 80
###-----------------------------------------------------###

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 80 -d $FW_IP --dport 1024:65535 -j ACCEPT




开放查询外部网路的 DNS 主机
开放内部网路,可以查询外部网路任何一台 DNS 主机。

作法如下∶(预设 policy 为 DROP)

###-----------------------------------------------------###
# open DNS port 53
###-----------------------------------------------------###

# 第一次会用 udp 封包来查询
iptables -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT

# 若有错误,会改用 tcp 封包来查询
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT

# 开放这台主机上的 DNS 和外部的 DNS 主机互动查询∶使用 udp
iptables -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT
# 开放这台主机上的 DNS 和外部的 DNS 主机互动查询∶使用 tcp
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! -y -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT





开放内部主机可以 ssh 至外部的主机
开放内部网路,可以 ssh 至外部主机。

作法如下∶(预设 policy 为 DROP)

###-----------------------------------------------------###
# open 外部主机 ssh port 22
###-----------------------------------------------------###

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1024:65535 -j ACCEPT

# 以下是 ssh protocol 比较不同的地方
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1020:1023 -d any/0 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1020:1023 -j ACCEPT




开放内部主机可以 ftp 至外部的主机
开放内部网路,可以 ftp 至外部主机。

作法如下∶(预设 policy 为 DROP)

###-----------------------------------------------------###
# open 对外部主机 ftp port 21
###-----------------------------------------------------###

# 以下是打开命令 channel 21
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 21 -d $FW_IP --dport 1024:65535 -j ACCEPT

# 以下是打开资料 channel 20
iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 20 -d $FW_IP --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 1024:65535 -d any/0 --dport 20 -j ACCEPT

# 以下是打开 passive mode FTP 资料通道
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 1024:65535 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 1024:65535 -d $FW_IP --dport 1024:65535 -j ACCEPT

开放 ping
可以对外 ping 任何一台主机。

作法如下∶(预设 policy 为 DROP)

iptables -A OUTPUT -o eth0 -p icmp -s $FW_IP --icmp-type 8 -d any/0 -j ACCEPT
iptables -A INPUT -i eth0 -p icm -s any/0 --icmp-type 0 -d $FW_IP -j ACCEPT

5/17/2008

为你的程序创建一个控制台

经常看到一些程序在运行的时候有一个WINDOWS控制台,感觉非常COOL。实际上有的时候帮助你监视系统运行是很方便的,那么怎么样创建一个控制台呢?

实际上WINDOWS为你提供了一系列的API来完成这个功能,例如:ReadConsole,WriteConsole等,具体参见MSDN。

下面我们用一段代码来说明如何创建Console.

1。首先调用AllocConsole函数来为你进程创建一个Console,该API是将当前进程Attache到一个新创建的Console上。你还可以通过调用SetConsoleTitle(tstrName);来设置Console的Title.

2。使用WriteConsoleOutput来将信息输出到Console上;在输出之前,先要得到Console的HANDLE,这通过GetStdHandle(STD_OUTPUT_HANDLE)来得到,然后将信息组织成Console的格式,然后输出。

3。关闭CONSOLE。当不需要这个CONSOLE的时候,调用FreeConsole来将当前进程从Console中Detach中。

4。通过创建一个进程来为监视你的CONSOLE输入和输出;你可以创建一个线程然后来,在线程中取得标准输入和输出CONSOLE的HANDLE,然后循环监视其事件,再对不同的事件进行处理。

详细代码参见:http://blog.csdn.net/windcsn/archive/2005/11/27/537737.aspx

----------------------------------------------------
你说的是在GUI程序中使用控制台吧, 对于VC, 其实有一个简单的方法:
在选项 Post-builder step 里新建command, 输入:
editbin /SUBSYSTEM:CONSOLE $(OUTDIR)\filename.exe
(其中 filename 为可执行文件名)

在 Project | Setting...中设置, 如果你的可执行文件名为 HelloWorld.exe,
则你新建的 command 就为

editbin   /SUBSYSTEM:CONSOLE   $(OUTDIR)\HelloWorld.exe