發表文章

目前顯示的是 10月, 2009的文章

原來MicroSD加讀卡機還不是無敵啊

想說一般的USB Flash就是一個讀卡機加上Flash Module而已,沒想到這次在使用USB安裝Windows7時就失敗了,一直回報找不到系統現有分割,無法進行分割,請參閱安裝記錄檔,但進修復模式去又可以正常format系統硬碟,還花了不少時間去研究安裝記錄檔Orz 後來覺得應該是讀卡機Driver的問題,所以再改成使用正常的USB隨身碟就可以安裝了~

非同步呼叫底層的設計,Asynchronous Base Method

  如果有寫過比較大的UI程式,一定需要用到非同步,因為使用者第一接觸就是UI界面,只要使用者感覺UI不順、有Hang住的感覺,一定會抱怨Orz。 之前我在寫的時候,一般都是另外開Thread來做運算,但麻煩的是算完之後要回報給MainThread的處理,都要知道MainThread的Class的名字來Callback,所以都是copy以前的code,ex: if(this.InvokeRequired){} 之類的,這樣都沒有一個通用的解決方案,今天在codeproject看到一個AsyncBaseClass.cs,終於學到怎麼寫通用的非同步呼叫。 流程如下,MainThread呼叫AsyncMethod,會把Dispatcher存起來 CallingDispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher,接下來開thread去做 System.Threading.ThreadPool.QueueUserWorkItem(MyMethodThreaded, parameters); 在MyMethodThreaded的最後再使用剛剛的Dispatcher來invoke CallingDispatcher.BeginInvoke(                 new Action<int, object>(FireMyMethodCompleteEvent),                 result,                 parameters.CallerStateObject             ); 這樣FormMain就不會有甚麼很醜的Code了,ex: if(this.InvokeRequired)。 參考資料: http://www.codeproject.com/KB/threads/AsyncDemo.aspx

Dll Injection 簡介

公司最近因為加上了網路控管,之前使用VPN的方式躲過,但實在是太慢了,所以又另找解法,經由強者者同事告知,原來只要製造出假Process就可以順利上網,但要創造出假的Process,我只有想到兩種方法,一種很簡單,一種很複雜,第一種就是你把隨便一隻程式改名,例如把notepad.exe,改為Orz.exe,這樣檢查程式就會以為Orz.exe已經再執行了,缺點是可能會耗一點GDI的資源,雖然執行起來之後就隱藏了,但完美主義的我總是覺得不夠漂亮。 第二種則是現在要講的稱為Dll Injection技術,先講一下用途為何,某支沒有Source的程式呼叫WindowsAPI的時候,你希望可以改寫WindowsAPI的行為,這就需要用到Dll Injection,技術上來說就是對方的程式會改為呼叫你寫的Code,至於要不要繼續呼叫WindowsAPI,就看你的Code怎麼寫。 像上面的需求,一般列出Windows,應該是用EnumWindow,所以我就需要寫一個EnumWindow的取代函式,讓其使用。但要修改這部分則沒有那麼簡單,因為OS有實做Virtual Memory的關係,每個Process都是各自的記憶體空間,所以對方的Process是無法呼叫到你的Process裡面的函式的。DLL在Windows是一個特例,因為DLL Code在記憶中是共用的,所以可以被其他Process映射過去執行。至於要怎麼映射,這裡則是我覺得學Windows API滿精彩的一部分~ 當年接了一個CASE,需求是當USB裝置插入的時候,程式可以得知,一直寫不出來,但手中有一個小程式可以做到這個功能,只是他會跳出MessengeBox來,所以我把小程式隱藏,然後攔截他呼叫的MessageBox函式,再通知我的程式,這樣就OK了~ 下面是我當年的筆記,其實重點就是要知道現在正在執行的Code是在哪一個空間執行,DLL裡面會實做下面幾個函式 int __stdcall HOOK_MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,UINT uType) 這個是取代MessageBox的函式,也就是小程式會呼叫到這裡 int replace_IAT(const char *pDllName,const char *pApiName,boo

無法刪除的資料夾 or 檔案

今天使用了 FileZilla 抓某部電影,Server 是 Linux ,也不知道出了甚麼問題,看檔名是正常,但就是無法抓下來,結果Windows建立的目錄也無法刪除,使用Unlocker看也沒有甚麼Process Lock住,使用cmd直接del 完整檔名也不行。 於是使用google搜尋了 "no longer located",因為錯誤訊息有這段文字,就看到下面的解法了: 1. Open an command prompt 2. Navigate to the folder where the files are located 3. Run this DOS command: dir /a /x /p 4. You will get a listing of files including the 8.3 file names 5. Delete the file files using the [8.3] file name, example:, leave off the [ ] brackets: 6. [del INBILLB~1] or [del VSXBUI~2.txt] 7. Sometime you can simply try [del *.*] and delete all of the file 我是用 rmdir 8.3FileName 來解決,科科~