顯示具有 程式設計 標籤的文章。 顯示所有文章
顯示具有 程式設計 標籤的文章。 顯示所有文章

2011年5月1日

在 C# 中取得 process 中載入的 dll的相關資訊

其實是為了某個最近剛出沒多久的 SLG 遊戲… 雖然有 SSG 檔,但是少一個插座很不方便有些地方很不方便,所以才想要自己寫一個,不過雖然參考 SSG 可以抓位置,但是實際上連 SSG 都還看不是很懂呢… 總之先備份一下… 感覺之前寫其他遊戲的修改器也常用到

processPtr = FindWindow(@"AliceStartWindowClass", null);
GetWindowThreadProcessId(processPtr, out ProcessId);
ProcessHandle = OpenProcess(0x1F0FFF, true, ProcessId);

EnumProcessModules(ProcessHandle, ModuleHandles, 20, out requireSize);
ModuleHandles = new IntPtr[requireSize/4];
EnumProcessModules(ProcessHandle, ModuleHandles, requireSize, out requireSize);

// 剛好最後一個 dll 是我要找的那個
dllHandle = ModuleHandles[requireSize/4 - 1];

GetModuleFileNameEx(processPtr, dllHandle, fileName, 260);
GetModuleInformation(ProcessHandle, dllHandle, out ModInfo, 12);

基本上是參考這篇 VB 的改寫而來的…

接下來就是要看懂 SSG 了啊~
--
C# 中引用 win32 api 的 list

2009年12月8日

讓 USB 隨身碟同時可以安裝 Linux/Windows 7

身為一個專業的阿宅,每次安裝 OS 的時候總是要找光碟找半天,偏偏很多 Server、Notebook 都沒有光碟機,找學弟借也只是權宜之計。
剛好手邊有個 160G 的隨身碟,就打算來建立一個可以用 USB 開機且安裝 OS 的 USB 隨身硬碟。
我的需求「看似」很簡單,不過實際上 google 了很久倒是沒什麼解法…所以在解決了這個難題之後,特地把他記錄下來…

Require:
開機時我可以選擇要使用哪一個 iso 檔案來開機
除了一般的 Unix-Like OS 之外,我還要能夠安裝 Windows 7

1. 單純 Unix-Like OS 的話很簡單,請直接 google BootMyISO 解決
2. 單純 Windows 7 的話也很簡單,請直接 /boot/bootsect X:,xcopy E: /s /e /f X:
    X: 為 USB 隨身碟代號, E: 為光碟機代號
3. 如果沒這麼單純的話請往下看…
其實解法很簡單,我個人的步驟是
1. 請先把你的隨身碟格式化成 FAT32 (之後就不要再格式化囉,只格式化這一次)
2. 然後參考 PTT 這篇文章 (原文已經被刪除…另外 google 到原作者的 blog 網頁版 )先確認你的 USB 隨身碟可以正確跑到 memtest86+
3. 我把 Ubuntu lucid 10.04 dialy build 2009-12-07 的 iso 檔丟進去,並且依照上篇文章修改,並且確認可正常開機。
4. 接著參考 這篇文章 的後半段,從 Step 9 開始到 Step 11。
5. 這時候,隨身碟就只能用 Windows 7 開機,於是再重新用第二步的 BootMyISO 重新執行一次。
6. 重新把 Ubnutn 的 menu.list 寫入。
7. 加入給 Windows 7 用的 menu.lst
title Windows 7 64bit Ent
# find --set-root /pmagic-4.5.iso
# map /pmagic-4.5.iso (hd32)
# map --hook
# root (hd32)
chainloader /bootmgr
8. 我整個 menu.lst 是這樣
default 0
timeout 30
color cyan/blue white/blue
foreground ffffff
background 003f7d
title Memtest86+
find --set-root /memtest86+-4.00.iso
map --mem /memtest86+-4.00.iso (hd32)
map --hook
root (hd32)
chainloader (hd32)
title Windows 7 64bit Ent
chainloader /bootmgr
title lucid-alternate-i386.iso
find --set-root /bootiso/lucid-alternate-i386.iso
map /bootiso/lucid-alternate-i386.iso (hd32)
map --hook
root (hd32)
chainloader (hd32)
9. 完成之後,這個隨身碟就可以拿去安裝 Ubuntu/Windows 7 了。
不過根據我測試的結果,舊一點的主機板雖然支援 USB-HDD 開機,但還是無法正常進去 Windows 7 的安裝畫面。不過我測了手邊的幾台電腦:X200、LS400、X61 都是可以正常進到 Windows 7 64bit 安裝畫面與 Ubuntu Lucid 10.04 的安裝畫面的。
P.S 我猜,如果確定你的隨身碟支援 USB-HDD 開機的話,也許可以跳過 1、2、3 步驟,等 Windows 7 的 bootmbr 寫進去後,在用 grub 覆蓋回來就好。
多重開機可以參考這篇:http://www.pendrivelinux.com/boot-multiple-iso-from-usb-multiboot-usb/
補上最後的 menu.lst
default 0
timeout 30
color white/blue yellow/black
title Ubuntu Lucid 10.94 Desktop i386 Dialy Build 20091207
find --set-root /bootiso/lucid-desktop-i386.iso
map /bootiso/lucid-desktop-i386.iso (0xff)
map --hook
root (0xff)
kernel /casper/vmlinuz file=/cdrom/preseed/ubuntu.seed boot=casper iso-scan/filename=/bootiso/lucid-desktop-i386.iso quiet splash locale=zh_TW
initrd /casper/initrd.lz
boot
title Windows 7 64bit Ent
# find --set-root /pmagic-4.5.iso
# map /pmagic-4.5.iso (hd32)
# map --hook
# root (hd32)
chainloader /bootmgr
# boot
title Ubuntu Lucid 10.94 Alternate i386 Dialy Build 20091207
find --set-root /bootiso/lucid-alternate-i386.iso
map /bootiso/lucid-alternate-i386.iso (hd32)
map --hook
root (hd32)
chainloader (hd32)
title Memtest86+
find --set-root /bootiso/memtest86+-4.00.iso
map --mem /bootiso/memtest86+-4.00.iso (hd32)
map --hook
root (hd32)
chainloader (hd32)
title Reboot
reboot
title Shutdown
halt

2009年11月17日

在 ubuntu/debian 中安裝 QualNet 4.5

因為 NS-2 似乎不太能滿足我的要求,因此我轉而向 QualNet 來求助。

然後因為我是喜歡嘗鮮的人,因此我安裝 QualNet 的 OS 是 Ubuntu 10.4 daily-build-20091116
1. 安裝好之後,請先解壓縮 QualNet 的壓縮檔
tar zxvf qualnet-4.5-evaluation.tar
2. 接著請安裝 java,請到 sun 網站下載後執行
./jdk-6u17-linux-i586.bin
3. 接著請設定環境變數
export JDK_HOME=/usr/local/share/jdk1.6.0_17
export QUALNET_HOME=/usr/local/share/qualnet/4.5
export PATH=$JDK_HOME/bin:$QUALNET_HOME:$PATH
4. 請到 QUALNET_HOME/main 的目錄底下,選擇您的 OS 並 make。(底下有很多各 OS 用的 makefile)
make -f Makefile-linux-glibc-2.3-gcc-4.0
5. 如果我的 ubuntu 是最新版,所以內建的 gcc 是 4.4,不過 make 的時候會產生錯誤,因此請裝回 4.1
aptitude install gcc-4.1 g++-4.1
6. 安裝完 g++-4.1 之後,請記得去改 Makefile-unix-common 中的 CC 和 CXX,將 gcc 和 g++ 改為 gcc-4.1 和 g++-4.1
#
# Define compilers.
#
CC = gcc-4.1
CXX = g++-4.1
7. 再次 make 會出現「ld cannot find -lexpat 的錯誤」,這時請在安裝 libexpat1 套件。
aptitude install libexpat1-dev
8. 再度 make,這次理論上就沒有任何問題了,檢查一下你的 QUALNET_HOME/bin 底下有沒有 qualnet 的執行檔。

2009年11月16日

在 Debian/Ubuntu 下建立 PSP 開發環境

由於最近入手了一台 PSP 2007,然後感覺在 PSP Programming 是件非常有趣的事情,所以就特地 google 了教學。雖然還沒有開始 coding,不過在第一次建置 PSP 開發環境的時候就順便寫了這篇教學。(主要的內容 reference from here
如果你用 windows 似乎可以使用這套軟體來解決一切,不過我比較喜歡在 Linux 上面玩~(Mac OS Leopard 的流程大同小異,不過我的 Macbook 不在我手邊,所以沒辦法測試。)

1. 首先請安裝下列套件
aptitude install autoconf automake bison flex gcc libgmp3-dev libmpfr-dev libusb-dev libncurses5-dev libreadline5-dev make patch subversion texinfo wget
2. 設定環境變數
export PSPDEV=/usr/local/pspdev
export PSPSDK=$PSPDEV/psp/sdk
export PATH=$PATH:$PSPDEV/bin:$PSPDEV/psp/bin:$PSPSDK/bin
3. 取得 PSPSDK 的 psptoolchain 套件
svn co svn://svn.ps2dev.org/psp/trunk/psptoolchain
4. 編譯
chmod a+x ./toolchain-sudo.sh
sudo ./toolchain-sudo.sh
5. 沒意外的話就等他慢慢編譯吧,我用一台 ubuntu-server 2.6 on P4 大約跑了 30 分鐘。
6. 接著請在 $PSPSDK/samples 目錄底下挑一個 sample 進去 make
7. 看到 EBOOT.PBP 產生就 OK 啦。

2009年11月11日

GOLANG:google 的程式語言:安裝

剛好看到最近 google 發布了自己開發的程式語言 go,擁有 c/c++/python 的特性,因此我就特地灌來玩玩。

官方網站在這 The Go Programming Language,基本上裡面也有安裝和教學,不過我自己實做的時候發現少了一兩步,google 之後才發現有另外的解法。

以下的實做系統是 Ubuntu 9.04 2.6.28 32bit

根據官方網站 How To 中的 Install Go

1. 必須先在環境變數中加入底下四個變數

$GOROOT:下載 go source code 與 complie 的路徑

$GOOS:目標的作業系統:linux、darwin(Mac OS X 10.5 or 10.6)、nacl(Native Client, an incomplete port)

$GOARCH:目標的版本:amd64 (64-bit x86, the most mature port), 386 (32-bit x86), and arm (32-bit ARM, an incomplete port). The valid combinations are linux/amd64, linux/arm, linux/386, darwin/amd64, darwin/386, and nacl/386.

$GOBIN(選用):編譯後 complier 的路徑,預設為 $HOME/bin 請記得要加入到你的 $PATH 設定中

這邊是我的設定檔,請修改並加在你的 ~/.bashrc 檔案中

export GOROOT=$HOME/go
export GOOS=linux
export GOARCH=386
export GOBIN=$HOME/bin
export PATH=$GOBIN:$PATH

2. 請透過 easy_install(python)或 aptitude(debian/ubuntu)來安裝 mercurial(如果你沒有 hg 這個指令的話)

$ sudo easy_install mercurial # easy_install
$ sudo aptitude install mercurial # aptitude
# 兩個請擇一(我用 easy_install 裝不起來)

3. 接著請到 googlecode 取得 go 的 source code 來編譯

$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT

4. 建立 GOBIN 的資料夾(預設應該是不存在)

$ mkdir $GOBIN

5. 進入到 src 資料夾,複製 quietgcc 並開始編譯

$ cd $GOROOT/src
$ cp quietgcc.bash $GOBIN/quietgcc
$ ./all.bash

6. 一小段時間後,如果編譯沒意外的話,應該會看到下列的訊息

0 known bugs; 0 unexpected bugs

7. 這時候就可以來寫個檔案測試囉~ 請用你喜歡的編輯器輸入下列程式

package main

import "fmt"

func main() {
        fmt.Printf("hello, world\n")
}

8. 存檔後,請編譯、link、就可以執行了

$ 8g hello.go # complie
$ 8l hello.8  # link
$ ./8.out     # run
hello, world  # output

# 官網上是使用 6g 不過 6g 是給 amd64 用的,一般 386 是用 8g

9. 請享用你的 GO 吧~ 更多的文件請查閱官方網站~~

2009年8月28日

Network Simulator:ns-2 安裝與基本操作 on Debian/Ubuntu

欸都,沒想到去年 training 之後,現在真的要開始用 ns-2 跑模擬了… 之前灌好的 macbook 不在我手邊,加上我也不想用筆電來跑模擬, 所以就找了一台 P4 的機器安裝 Ubuntu 9.10 alpha 4 來裝 ns-2 同時也在 vmware 上成功安裝在 debian 5.0 testing 的版本。 基本上這兩個 linux distribuction 安裝的步驟一模一樣(本是同根生…) 1. 這是我的 debian 版本 2. 下載 ns-2 allinone 的壓縮檔(我個人是偏好 cmdline 指令,當然也可以選擇從網頁瀏覽下載) wget http://downloads.sourceforge.net/project/nsnam/allinone/ns-allinone-2.34/ns-allinone-2.34.tar.gz?use_mirror=nchc 3. 解壓縮並進入 ns-allinone-2.34 的目錄 tar zxvf ns-allinone-2.34.tar.gz cd ns-allinone-2.34 4. 安裝與編譯 ./install 5. 如果安裝過程中出現下列這兩個情況 請安裝 libxmu-dev sudo aptitude install libxmu-dev 請安裝 g++ sudo aptitude install g++ 6. 如果順利安裝好,就會看到下列的畫面 7. 請依照指示把這些路徑加到環境變數裡面 vi ~/.bashrc 路徑 export NS_HOME=/home/chrisliu/ns-allinone-2.34 export PATH=$NS_HOME/ns-2.34:$NS_HOME/tcl8.4.18/unix:$NS_HOME/tk8.4.18/unix:$NS_HOME/bin:$PATH export LD_LIBRARY_PATH=$NS_HOME/tcl8.4.18/unix:$NS_HOME/tk8.4.18/unix:$NS_HOME/otcl-1.13:$NS_HOME/lib:$LD_LIBRARY_PATH export TCL_LIBRARY=$NS_HOME/tcl8.4.18/library 8. 請下載範例檔下來 點我下載 wget http://chrisliuqq.googlepages.com/example.tcl 9. 執行測試 ns example.tcl 10. 跑完後目錄底下會多一個 out.tr 檔案,這時候就要採用 awk 來分析了,請先下載 awk 檔 點我下載 wget http://chrisliuqq.googlepages.com/delay.awk 11. 執行 awk 來分析 awk -f delay.awk out.tr Leopard 版的安裝請參考之前寫的文章 Training:Network Simulator:ns-2 安裝與基本操作

2008年7月30日

Training:Socket Programming on C#

教育訓練第二彈,下午的課程就是在教如何使用 .NET 架構寫一個 Socket 的程式。此範例是使用 C#。 所有程式碼可從這邊取得。 (不過程式碼有點亂…而且沒有加註解,請斟酌使用。) Server 端 using System; using System.Collections.Generic; using System.Text; // include Socket library using System.Net; using System.Net.Sockets; namespace tcpServerStarter { class Program { static void Main(string[] args) { // 建立 tcpServer 物件並啟動 server tcpServer server = new tcpServer(IPAddress.Any, 520); server.startServer(); } } // tcpServer Class public class tcpServer { IPAddress _ip; // 要 listen 的 ip int _port; // 要 listen 的 port bool _serverAlive = false; // 檢查 server 是否還存活 // tcpServer construtor public tcpServer(IPAddress ip, int port) { this._ip = ip; this._port = port; } // 啟動 server 的 method public void startServer() { 將 _serverAlive 的 flag 設為 true _serverAlive = true; try { // 建立一個 TcpListener 的物件,並且 listen 在 _ip 與 _port TcpListener listen = new TcpListener(this._ip, this._port); // 開始 listen listen.Start(); // 如果 Server 還活著 while (_serverAlive) { // 取得由 TcpListener 得到的 TcpClient TcpClient tcpClient = listen.AcceptTcpClient(); // 由 TcpClient 建立一個 NetworkStream NetworkStream netStream = tcpClient.GetStream(); // 建立一個大小為 1024 的 byte 陣列來放收到的資料 byte[] reciBuffer = new byte[1024]; int count = 0; // 將經由 Stream 讀取道的資料放入 readBuffer 中 // 並且將長度存到 count while ((count = netStream.Read(readBuffer, 0, readBuffer.Length)) != 0) { // 將 byte 陣列轉成 string string reciStr = System.Text.Encoding.UTF8.GetString(reciBuffer, 0, count); Console.WriteLine("recieve data:" + reciStr); // 傳出的字串 = 收到的字串 string sendStr = reciStr; // 將 string 轉成 byte 陣列 byte[] sendBuffer = System.Text.Encoding.UTF8.GetBytes(sendStr); // 將資料送出 netStream.Write(sendbuffer, 0, sendBuffer.Length); Console.WriteLine("send data:" + sendstr); } } } catch { } } } } Client 端 建立 TextBox1、TextBox2、TextBox3、Button1 TextBox1 為要連接的 server ip TextBox2 為要連接的 port TextBox3 為從 server 收到的資料 Button1 為連接 server 的按鈕 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; // include Socket Library using System.Net; using System.Net.Sockets; namespace tcpClient { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // 建立一個 TcpClient 物件連接到 ip, port TcpClient client = new TcpClient(textBox1.Text, int.Parse(textBox2.Text)); // 由 TcpClient 建立一個 Stream NetworkStream netStream = client.GetStream(); // 自訂要送出的資料為 123456 string sendMsg = "123456"; // 將字串轉為 byte 陣列 byte[] sendBuffer = System.Text.Encoding.UTF8.GetBytes(sendMsg); // 送出給 server netStream.Write(sendBuffer, 0, sendBuffer.Length ); // 建立一個大小為 1024 的 byte 陣列來放收到的資料 byte[] readBuffer = new byte[1024]; // 讀取從 server 來的資料並放到 readBuffer 中 netStream.Read(readBuffer, 0, readBuffer.Length); // 將 byte 陣列轉為 string string readStr = System.Text.Encoding.UTF8.GetString(readBuffer, 0, readBuffer.Length); // 將讀取到的字串顯示在 textBox3 textBox3.Text = readStr; } } }

2007年4月8日

Firefox 的 yahoo字典 extension

檔案名稱:YahooDict.xpi 檔案大小:4.0 KB 首頁連結:http://fx.chrisliu.net/ 檔案簡介:更快速的使用 Yahoo 線上字典查詢您想要查詢的單字。. 測試平台: Windows XP SP2 Firefox 2.0.0.3 自言自語: 已經將網站製作完成,並且也將尋找更新等等的部份也架設好了。 目前是很可愛的 0.0.0.1 版本,什麼都沒有,就是簡單的右鍵選取。 未來視情況要不要加入自動切換到該頁的選項。

2007年3月6日

MSN正在播放的歌曲

檔案名稱:MSN_Playing.exe 檔案大小:24.0 KB MD5檢查:19ca760176f57fbb76c5bc2eef438b0a 壓縮下載:從studentweb.ncnu.edu.tw下載 壓縮大小:7.07 KB 檔案簡介: 將自動列出桌面上所有的視窗標題供使用者選擇並快速設定至MSN的「現在正在播放的歌曲」。 未來發展: 雖然目前有不少構想,例如:定時隨機跟換暱稱、使用者自訂動詞等等,但由於我是懶惰人,而且這些功能我都用不到,所以我也不會無聊就增加他們。端看未來會不會變成 popular 的小軟體 XD,有的話就在說。 測試平台: Windows XP SP2 Microsoft .NET Framework 2.0 版可轉散發套件 Microsoft MSN Messenger 7.0.0816 (*註1*註2) Messenger Plus! 3.63.148 - April 4th 2006 StuffPlug-NG 2.2.397 *註1:由於我不喜歡用 7.5 和 8.0 Live Messenger 所以還是用最穩定的 7.0.0816但是部份的程式碼是參考 8.0 Live Messenger 的現在正在播放的歌曲,所以7.5 和 8.0 應該是都可以正常運作。 *註2:我的 7.0.0816 有用 messpatch0816 Patch 去廣告以及多重登入。