如何讀取硬碟bios顯示的總容量 |
尚未結案
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
請問一下 如何在win2000下讀取 硬碟的問題
1 如何讀取硬碟的bios顯示型號
2 如何讀取硬碟bios顯示的總容量
3 如何讀取RAID的硬碟數量
4 不論此硬碟是否有隱藏檔或非windows的分割區
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
這是 dllee 大仔與lcsboy 大仔幫忙的
要讀出實體硬體的資料/廠商/型號/序號/大小等等,可以透過 ATA Command ,如 lcsboy 所發表的:
【BCB】【分享】在Win2K/WinXP/Win.Net讀出硬碟序號
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21428
【BCB】【發表】WinRing:任何函式皆可隨意進入Ring0(含Source)
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27086 至於要不要寫 DDK ,以 lscboy 的方法,好像都要吧... 不過 lscboy 都已幫我們寫好了 剛找了一下發現
http://www.winsim.com/diskid32/diskid32.html
有 VC source 應可以滿足您的需求,在 2K/XP 下不需要 ddk 的樣子
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
不過 庵找過的一套軟體
http://www.r-tt.com/ http://delphi.ktop.com.tw/topic.php?TOPIC_ID=31793
上述的解答 好像已經是解答了
不過 庵不知道 ATA Command 哈哈
庵 手上還有一隻 8051 的exe他應該不是ddk喔 連硬碟的快取 馬達轉數都有數據
這是在2000下執行的喔 不是在純dos下喔 別攪混了 所以 應該還有其他方法 不知道有人知道嗎?
delphi可以呼叫嗎?
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
J SIR 給你參考 *****************************************************************
' Module for performing Direct Read/Write access to disk sectors
'
' Written by Arkadiy Olovyannikov (ark@fesma.ru)
'*****************************************************************
Option Explicit Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '*************Win9x direct Read/Write Staff**********
Public Enum FAT_WRITE_AREA_CODE
FAT_AREA = &H2001
ROOT_DIR_AREA = &H4001
DATA_AREA = &H6001
End Enum Private Type DISK_IO
dwStartSector As Long
wSectors As Integer
dwBuffer As Long
End Type
Private Type DIOC_REGISTER
reg_EBX As Long
reg_EDX As Long
reg_ECX As Long
reg_EAX As Long
reg_EDI As Long
reg_ESI As Long
reg_Flags As Long
End Type Private Const VWIN32_DIOC_DOS_IOCTL = 1& 'Int13 - 440X functions
Private Const VWIN32_DIOC_DOS_INT25 = 2& 'Int25 - Direct Read Command
Private Const VWIN32_DIOC_DOS_INT26 = 3& 'Int26 - Direct Write Command
Private Const VWIN32_DIOC_DOS_DRIVEINFO = 6& 'Extended Int 21h function 7305h Private Const FILE_DEVICE_FILE_SYSTEM = &H9&
Private Const FILE_ANY_ACCESS = 0
Private Const FILE_READ_ACCESS = &H1
Private Const FILE_WRITE_ACCESS = &H2 Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const OPEN_EXISTING = 3
Private Const INVALID_HANDLE_VALUE = -1& Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, ByRef lpInBuffer As Any, ByVal nInBufferSize As Long, ByRef lpOutBuffer As Any, ByVal nOutBufferSize As Long, ByRef lpBytesReturned As Long, ByVal lpOverlapped As Long) As Long '****************** NT direct Read/Write staff**************************************************
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long Private Declare Function FlushFileBuffers Lib "kernel32" (ByVal hFile As Long) As Long Private Declare Function LockFile Lib "kernel32" (ByVal hFile As Long, ByVal dwFileOffsetLow As Long, ByVal dwFileOffsetHigh As Long, ByVal nNumberOfBytesToLockLow As Long, ByVal nNumberOfBytesToLockHigh As Long) As Long Private Declare Function UnlockFile Lib "kernel32" (ByVal hFile As Long, ByVal dwFileOffsetLow As Long, ByVal dwFileOffsetHigh As Long, ByVal nNumberOfBytesToUnlockLow As Long, ByVal nNumberOfBytesToUnlockHigh As Long) As Long Private Const FILE_BEGIN = 0 Public Function DirectReadDrive(ByVal sDrive As String, ByVal iStartSec As Long, ByVal iOffset As Long, ByVal cBytes As Long) As Variant
If IsWindowsNT Then
DirectReadDrive = DirectReadDriveNT(sDrive, iStartSec, iOffset, cBytes)
Else
If FSName = "FAT12" Or FSName = "FAT16" Then
DirectReadDrive = DirectReadFloppy9x(sDrive, iStartSec, iOffset, cBytes)
Else
DirectReadDrive = DirectReadDrive9x(sDrive, iStartSec, iOffset, cBytes)
End If
End If
End Function Public Function DirectWriteDrive(ByVal sDrive As String, ByVal iStartSec As Long, ByVal iOffset As Long, ByVal sWrite As String, Optional AreaCode As FAT_WRITE_AREA_CODE = DATA_AREA) As Boolean
If IsWindowsNT Then
DirectWriteDrive = DirectWriteDriveNT(sDrive, iStartSec, iOffset, sWrite)
Else
If FSName = "FAT12" Or FSName = "FAT16" Then
DirectWriteDrive = DirectWriteFloppy9x(sDrive, iStartSec, iOffset, sWrite)
Else
DirectWriteDrive = DirectWriteDrive9x(sDrive, iStartSec, iOffset, sWrite, AreaCode)
End If
End If
End Function '===Direct Read/Write floppy using Int25/26===
'Works only for FAT12/16 systems, but much more quicker
'Then Int21 7305 function Private Function DirectReadFloppy9x(ByVal sDrive As String, ByVal iStartSec As Long, ByVal iOffset As Long, ByVal cBytes As Long) As Variant
Dim hDevice As Long
Dim reg As DIOC_REGISTER
Dim nSectors As Long
Dim aOutBuff() As Byte
Dim abResult() As Byte
Dim nRead As Long
nSectors = Int((iOffset + cBytes - 1) / BytesPerSector) + 1
ReDim aOutBuff(nSectors * BytesPerSector)
ReDim abResult(cBytes - 1) As Byte
With reg
.reg_EAX = Asc(UCase(sDrive)) - Asc("A")
.reg_ESI = &H6000
.reg_ECX = nSectors
.reg_EBX = VarPtr(aOutBuff(0))
.reg_EDX = iStartSec
End With
hDevice = CreateFile("\\.\VWIN32", GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)
If hDevice = INVALID_HANDLE_VALUE Then Exit Function
Call DeviceIoControl(hDevice, VWIN32_DIOC_DOS_INT25, reg, Len(reg), reg, Len(reg), nRead, 0&)
CloseHandle hDevice
CopyMemory abResult(0), aOutBuff(iOffset), cBytes
DirectReadFloppy9x = abResult
End Function Private Function DirectWriteFloppy9x(ByVal sDrive As String, ByVal iStartSec As Long, ByVal iOffset As Long, ByVal sWrite As String) As Boolean
Dim hDevice As Long
Dim reg As DIOC_REGISTER
Dim nSectors As Long
Dim abBuff() As Byte
Dim ab() As Byte
Dim nRead As Long
nSectors = Int((iOffset + Len(sWrite) - 1) / BytesPerSector) + 1
abBuff = DirectReadFloppy9x(sDrive, iStartSec, 0, nSectors * BytesPerSector)
ab = StrConv(sWrite, vbFromUnicode)
CopyMemory abBuff(iOffset), ab(0), Len(sWrite)
With reg
.reg_EAX = Asc(UCase(sDrive)) - Asc("A")
.reg_ESI = &H6000
.reg_ECX = nSectors
.reg_EBX = VarPtr(abBuff(0))
.reg_EDX = iStartSec
End With
hDevice = CreateFile("\\.\VWIN32", GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)
If hDevice = INVALID_HANDLE_VALUE Then Exit Function
DirectWriteFloppy9x = DeviceIoControl(hDevice, VWIN32_DIOC_DOS_INT26, reg, Len(reg), reg, Len(reg), nRead, 0&) And Not (reg.reg_Flags And 1)
CloseHandle hDevice
End Function '====Direct Read/Write drive using Int21 function 7305h====
'works with FAT12/16/32 Private Function DirectReadDrive9x(ByVal sDrive As String, ByVal iStartSec As Long, ByVal iOffset As Long, ByVal cBytes As Long) As Variant
Dim hDevice As Long
Dim reg As DIOC_REGISTER
Dim dio As DISK_IO
Dim abDioBuff() As Byte
Dim nSectors As Long
Dim aOutBuff() As Byte
Dim abResult() As Byte
Dim nRead As Long
nSectors = Int((iOffset + cBytes - 1) / BytesPerSector) + 1
ReDim abResult(cBytes - 1) As Byte
ReDim aOutBuff(nSectors * BytesPerSector - 1)
With dio
.dwStartSector = iStartSec
.wSectors = CInt(nSectors)
.dwBuffer = VarPtr(aOutBuff(0))
End With
ReDim abDioBuff(LenB(dio) - 1)
CopyMemory abDioBuff(0), dio, LenB(dio)
CopyMemory abDioBuff(6), abDioBuff(8), 4&
With reg
.reg_EAX = &H7305 'function number
.reg_ECX = -1&
.reg_EBX = VarPtr(abDioBuff(0))
.reg_EDX = Asc(UCase(sDrive)) - Asc("A") + 1
End With
hDevice = CreateFile("\\.\VWIN32", GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)
If hDevice = INVALID_HANDLE_VALUE Then Exit Function
Call DeviceIoControl(hDevice, VWIN32_DIOC_DOS_DRIVEINFO, reg, Len(reg), reg, Len(reg), nRead, 0&)
CloseHandle hDevice
CopyMemory abResult(0), aOutBuff(iOffset), cBytes
DirectReadDrive9x = abResult
End Function Private Function DirectWriteDrive9x(ByVal sDrive As String, ByVal iStartSec As Long, ByVal iOffset As Long, ByVal sWrite As String, ByVal AreaCode As FAT_WRITE_AREA_CODE) As Boolean
Dim hDevice As Long, nSectors As Long
Dim nRead As Long
Dim reg As DIOC_REGISTER
Dim dio As DISK_IO
Dim abDioBuff() As Byte
Dim abBuff() As Byte
Dim ab() As Byte
Dim bLocked As Boolean
nSectors = Int((iOffset + Len(sWrite) - 1) / BytesPerSector) + 1
abBuff = DirectReadDrive9x(sDrive, iStartSec, 0, nSectors * BytesPerSector)
ab = StrConv(sWrite, vbFromUnicode)
CopyMemory abBuff(iOffset), ab(0), Len(sWrite)
With dio
.dwStartSector = iStartSec
.wSectors = CInt(nSectors)
.dwBuffer = VarPtr(abBuff(0))
End With
ReDim abDioBuff(LenB(dio) - 1)
CopyMemory abDioBuff(0), dio, LenB(dio)
CopyMemory abDioBuff(6), abDioBuff(8), 4&
With reg
.reg_EAX = &H7305 'function number
.reg_ECX = -1&
.reg_EBX = VarPtr(abDioBuff(0))
.reg_EDX = Asc(UCase(sDrive)) - Asc("A") + 1
.reg_ESI = AreaCode
End With
hDevice = CreateFile("\\.\VWIN32", GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)
If hDevice = INVALID_HANDLE_VALUE Then Exit Function
Dim i As Integer
For i = 0 To 3
If LockLogicalVolume(hDevice, Asc(UCase(sDrive)) - Asc("A") + 1, CByte(i), 0) Then
bLocked = True
Exit For
End If
Next i
If Not bLocked Then GoTo WriteError
DirectWriteDrive9x = DeviceIoControl(hDevice, VWIN32_DIOC_DOS_DRIVEINFO, reg, Len(reg), reg, Len(reg), nRead, 0&) And Not (reg.reg_Flags And 1)
Call UnlockLogicalVolume(hDevice, Asc(UCase(sDrive)) - Asc("A") + 1)
WriteError:
CloseHandle hDevice
End Function Private Function LockLogicalVolume(hVWin32 As Long, bDriveNum As Byte, bLockLevel As Byte, wPermissions As Integer) As Boolean
Dim fResult As Boolean
Dim reg As DIOC_REGISTER
Dim bDeviceCat As Byte ' can be either 0x48 or 0x08
Dim cb As Long
' Try first with device category 0x48 for FAT32 volumes. If it
' doesn 't work, try again with device category 0x08. If that
' doesn 't work, then the lock failed.
bDeviceCat = CByte(&H48)
ATTEMPT_AGAIN:
reg.reg_EAX = &H440D&
reg.reg_EBX = MAKEWORD(bDriveNum, bLockLevel)
reg.reg_ECX = MAKEWORD(CByte(&H4A), bDeviceCat)
reg.reg_EDX = wPermissions
fResult = DeviceIoControl(hVWin32, VWIN32_DIOC_DOS_IOCTL, reg, LenB(reg), reg, LenB(reg), cb, ByVal 0&) And Not (reg.reg_Flags And 1)
If (fResult = False) And (bDeviceCat <> CByte(&H8)) Then
bDeviceCat = CByte(&H8)
GoTo ATTEMPT_AGAIN
End If
LockLogicalVolume = fResult
End Function Private Function UnlockLogicalVolume(hVWin32 As Long, bDriveNum As Byte) As Boolean
Dim fResult As Boolean
Dim reg As DIOC_REGISTER
Dim bDeviceCat As Byte ' // can be either 0x48 or 0x08
Dim cb As Long
' Try first with device category 0x48 for FAT32 volumes. If it
' doesn 't work, try again with device category 0x08. If that
' doesn 't work, then the unlock failed.
bDeviceCat = CByte(&H48)
ATTEMPT_AGAIN:
reg.reg_EAX = &H440D&
reg.reg_EBX = bDriveNum
reg.reg_ECX = MAKEWORD(CByte(&H6A), bDeviceCat)
fResult = DeviceIoControl(hVWin32, VWIN32_DIOC_DOS_IOCTL, reg, LenB(reg), reg, LenB(reg), cb, ByVal 0&) And Not (reg.reg_Flags And 1)
If (fResult = False) And (bDeviceCat <> CByte(&H8)) Then
bDeviceCat = CByte(&H8)
GoTo ATTEMPT_AGAIN
End If
UnlockLogicalVolume = fResult
End Function '=============NT staff=============
'Read/Wrire drive with any file system Private Function DirectReadDriveNT(ByVal sDrive As String, ByVal iStartSec As Long, ByVal iOffset As Long, ByVal cBytes As Long) As Variant
Dim hDevice As Long
Dim abBuff() As Byte
Dim abResult() As Byte
Dim nSectors As Long
Dim nRead As Long
nSectors = Int((iOffset + cBytes - 1) / BytesPerSector) + 1
hDevice = CreateFile("\\.\" & UCase(Left(sDrive, 1)) & ":", GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)
If hDevice = INVALID_HANDLE_VALUE Then Exit Function
Call SetFilePointer(hDevice, iStartSec * BytesPerSector, 0, FILE_BEGIN)
ReDim abResult(cBytes - 1)
ReDim abBuff(nSectors * BytesPerSector - 1)
Call ReadFile(hDevice, abBuff(0), UBound(abBuff) + 1, nRead, 0&)
CloseHandle hDevice
CopyMemory abResult(0), abBuff(iOffset), cBytes
DirectReadDriveNT = abResult
End Function Private Function DirectWriteDriveNT(ByVal sDrive As String, ByVal iStartSec As Long, ByVal iOffset As Long, ByVal sWrite As String) As Boolean
Dim hDevice As Long
Dim abBuff() As Byte
Dim ab() As Byte
Dim nRead As Long
Dim nSectors As Long
nSectors = Int((iOffset + Len(sWrite) - 1) / BytesPerSector) + 1
hDevice = CreateFile("\\.\" & UCase(Left(sDrive, 1)) & ":", GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)
If hDevice = INVALID_HANDLE_VALUE Then Exit Function
abBuff = DirectReadDriveNT(sDrive, iStartSec, 0, nSectors * BytesPerSector)
ab = StrConv(sWrite, vbFromUnicode)
CopyMemory abBuff(iOffset), ab(0), Len(sWrite)
Call SetFilePointer(hDevice, iStartSec * BytesPerSector, 0, FILE_BEGIN)
Call LockFile(hDevice, LoWord(iStartSec * BytesPerSector), HiWord(iStartSec * BytesPerSector), LoWord(nSectors * BytesPerSector), HiWord(nSectors * BytesPerSector))
DirectWriteDriveNT = WriteFile(hDevice, abBuff(0), UBound(abBuff) + 1, nRead, 0&)
Call FlushFileBuffers(hDevice)
Call UnlockFile(hDevice, LoWord(iStartSec * BytesPerSector), HiWord(iStartSec * BytesPerSector), LoWord(nSectors * BytesPerSector), HiWord(nSectors * BytesPerSector))
CloseHandle hDevice
End Function Function MAKEWORD(ByVal bLo As Byte, ByVal bHi As Byte) As Integer
If bHi And &H80 Then
MAKEWORD = (((bHi And &H7F) * 256) + bLo) Or &H8000
Else
MAKEWORD = (bHi * 256) + bLo
End If
End Function 願以此功德 莊嚴佛淨土 上報四重恩 下濟三塗苦 若有見聞者 悉發菩提心 盡此一報身 同生極樂國
------
︿︿ |
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
cmf 大仔 真是利害 非常利害雖然不是delphi也是有據參考的價值 看來 L sir說的 ATA command int 13h 庵與你結梁仔了 真正是 頭痛 頭痛 頭痛 cmf 大仔 謝謝拉 ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
希望 有相關資料的人 能提供給 J SIR 书名: Delphi下深入Windows核心编程 附CD 内容简介 本书是一本介绍Windows核心技术及高级技巧的专著。从系统内核编程出发,使用大量的例子帮助读者理解这些编程技术,讲述了线程同步及隐藏、系统钩子深入分析、读写物理磁盘的关键技术、读写物理内存和其他进程内存的核心技术、Windows 9x下调用16位实模式和保护模式代码的核心技术、直接读写端口技术、可执行文件加壳的技巧、PE结构分析、Ring0的实现、Windows API截取技术、屏幕取词技术等方面的内容。全书对热点源代码进行了深入剖析和讲解,同时本书汇聚了作者利用Soft-ICE跟踪调试经验,作者多年的编程心得和技巧一览无遗。随书附送的光盘提供了书中涉及的程序源代码。
本书可对Windows核心编程感兴趣者提供帮助,亦可供广大编程人员及各大专院校师生参考。 近些年计算机软件的发展很快,从工具软件到管理软件都有很成熟的产品。软件系统的开发不但需要扎实的软件基础知识及团队合作精神,还需要对Windows 9x下调用16位实模式和保护模式代码的核心技术、直接读写端口技术、可执行文件加壳的技巧、PE结构分析、Ring0的实现、API截取技术、屏幕取词技术等方面的内容。
其中的屏幕取词技术是网络上许多BBS的热点话题,遗憾的是BBS上涉及到关键技术时都含糊其词。本书将介绍一个完整的屏幕取词程序(包括16位的Thunk关键技术,适用于Windows 9x下保护模式编程的一个技巧(漏洞),从Ring3跳到Ring0执行一些系统服务函数,做了一些“见不得人”的操作:用垃圾数据覆盖硬盘扇区、读写破坏BIOS芯片。CIH病毒源代码中有许多值得学习的地方,本书中的API、屏幕取词等技术。
全书分为10章,内容简介如下:
第1章DLL与数据共享,在Win32中通过使用内存映像文件、全局原子等实现多进程共享数据,这一章是基础,后面的很多章节都使用了本章介绍的数据共享技术。
第2章钩子原理,介绍了消息(包括键盘、鼠标消息)的截取、钩子的安装、DLL注入其他进程的方法等技术。这一章所介绍的内容是后面截取Windows内核有了一定的了解,介绍了进程的枚举、线程的同步、进程深度隐藏的种种方法及技巧、Windows 9x/NT/2000时间变速器的实现原理、16位与32位代码的核心接口技术等方面的内容。
第5章磁盘读写,分别提供了Windows的PE文件结构,并详细分析了其中每部分的含义,这是截取API Hook及屏幕取词,介绍了16位和32位API Hook技术、API Hook技术、Windows 9x的地方,都适用于Windows NT/2000的地方,都适用于Windows NT/2000下列举进程的方法
3.2.4 进程模块的列举
3.2.5 终止进程
3.2.6 创建进程并监视进程运行
3.3 进程隐藏深入剖析
3.3.1 进程隐藏原理
3.3.2 Windows NT/2000进程远程写入实现深度隐藏
3.4 线程
3.4.1 线程的优先级
3.4.2 线程的挂起和继续
3.4.3 执行线程
3.4.4 线程同步
3.4.5 列举本进程的所有线程
3.5 Windows 9x下的时间变速(变速齿轮)
4.4 端口读写驱动PortTalk
4.4.1 PortTalk与Delphi的接口
4.4.2 Windows 9x下读写逻辑磁盘扇区的方法
5.1.2 INT13实现读写软盘物理磁盘扇区
5.1.3 利用VxD和CIH病毒中的Ring0技术
5.1.4 调用16位实模式的核心技术
5.1.5 Windows 9x下读写物理内存的核心技术
9.5.1 编写VxD读写内存
9.5.2 利用16位DLL代码读写物理内存
9.6 API Hook及屏幕取词 10.1 API Hook入门
10.1.2 陷阱式API Hook
10.1.4 Windows NT/2000下32位取词及关键技术
10.2.2 Windows 9x下16位、32位取词及核心技术 附录A Delphi编译指令说明 A.1 使用编译设置对话框
A.2 使用编译指令
A.3 使用条件编译指令 附录B Delphi编译错误信息对照表
願以此功德 莊嚴佛淨土 上報四重恩 下濟三塗苦 若有見聞者 悉發菩提心 盡此一報身 同生極樂國
------
︿︿ |
turboted
版主 發表:95 回覆:754 積分:452 註冊:2002-07-23 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
在9x下直接訪問硬盤 在Windows9X中,由於內存和進程的保護,直接使用INT將會引起GPFs。在很多資料上都說要在windows中直接讀寫硬盤的方法只有使用VxD。這並不是真的,事實上使用windows9x公開的API就可以直接對硬盤進行操作。在microsoft programmer's guide to win95中,關於Device I/O Control中就有說明如何使用VWIN32呼叫MSDOS系統服務(磁盤訪問類)。定義了一下5個控制碼:
VWIN32_DIOC_DOS_DRIVEINFO (6) INT 21h AX=730Xh,win95 osr2與以後版本提供的FAT32文件系統的訪問
VWIN32_DIOC_DOS_INT13 (4) BIOS INT13h
VWIN32_DIOC_DOS_INT25 (2) DOS INT25h
VWIN32_DIOC_DOS_INT26 (3) DOS INT26h
VWIN32_DIOC_DOS_IOCTL (1) DOS設備I/O,(int 21h,ax=4400h到4411h)
使用方法如下:
使用
CreateFile("\\\\.\\vwin32",0,0,NULL,0,FILE_FLAG_DELETE_ON_CLOSE,NULL);
打開vwin32.vxd
根據調用的功能所用到的寄存器填充以下結構體:
typedef struct _DIOC_REGISTERS {
DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
} DIOC_REGISTERS, *PDIOC_REGISTERS;
使用
DeviceIoControl(hDevice,CONTROL_CODE,®,sizeof(reg),®,sizeof(reg),
&dwBytesReturn,0);
調用MS-DOS的磁盤訪問功能。
最後調用 CloseHandle(hDevice); 確定硬盤空間
在安裝一些軟件時,我們會看來一些安裝程序會對你說你選的硬盤空間不夠,這種確定硬盤空間的程序是如何做到的呢?
GetDiskFreeSpace是一個返回一個磁盤大小、劃分、可用空間等信息的函數,我們可以用它來達到目的。
DWORD sectorspercluster ;
DWORD bytespersector ;
DWORD clusters ;
DWORD freeclusters ;
GetDiskFreeSpace (path.c_str (),§orspercluster,&bytespersector,&freeclusters,&clusters); 確定系統還有多少內存 大家都會想看看自己的內存還有多少,在一些工具中我們可以看到,如果我們自己來做要做些什麼才能實現呢?
WINDOWS的API函數GlobalMemoryStatus是用來得到當前內存情況的,如果我們想實時看到內存的變化情況就要配合TIMER來完成了。我們是把提取每次內存情況和顯示做成一個函數,只要在TIMER中設定一個你想要的調用週期,就可以達到目的了。下面是一個系統信息程序的一段,也就是關於內存的部分。
void TForm1::UpdateUsage ()
{
MEMORYSTATUS memory ; memory.dwLength = sizeof (memory) ;
GlobalMemoryStatus (&memory) ; ProgressBar1->Position = (float) memory.dwMemoryLoad ; // Physical Memory Usage
ProgressBar2->Position = 100.0 * (memory.dwTotalPhys - memory.dwAvailPhys) /
(float) memory.dwTotalPhys ; Label7->Caption = String ((int) (memory.dwTotalPhys / 1024)) + " K Total" ; Label8->Caption = String ((int) (memory.dwAvailPhys / 1024))
+ " K Free" ; // Virtual Memory Usage
ProgressBar3->Position =
100.0 * (memory.dwTotalVirtual - memory.dwAvailVirtual) /
(float) memory.dwTotalVirtual ; Label9->Caption = String ((int) (memory.dwTotalVirtual / 1048576.0))
+ " MB Total" ; Label10->Caption = String ((int) (memory.dwAvailVirtual / 1048576.0))
+ " MB Free" ; // Page File Usage
ProgressBar4->Position =
100.0 * (memory.dwTotalPageFile - memory.dwAvailPageFile) /
(float) memory.dwTotalPageFile ; Label11->Caption = String ((int) (memory.dwTotalPageFile / 1048576.0))
+ " MB Total" ; Label12->Caption = String ((int) (memory.dwAvailPageFile / 1048576.0))
+ " MB Free" ;
} 願以此功德 莊嚴佛淨土 上報四重恩 下濟三塗苦 若有見聞者 悉發菩提心 盡此一報身 同生極樂國
------
︿︿ |
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
INT_13h 所有功能涵數之解說如下: 1. AH=00 (重置磁碟系統) ┐
2. AH=01 (取得磁碟狀態) │
3. AH=02 (讀取磁區資料) │由於一般 DOS 書籍已有介
4. AH=03 (寫入磁區資料) │紹 ,故不再多談。
5. AH=04 (驗證磁區好壞) │
6. AH=05 ( 格式化磁軌 ) ┘ 7. AH=06 格式化損壞的磁區 (PC/XT HD Only)
AL=磁區數
CH=磁柱號碼
DH=磁頭
DL=磁碟機 (80h-FFh)
返回代碼 :
成功進位旗標為零 ,AH=00
失敗進位旗標為壹 ,AH=狀態 (參考AH=01) 8. AH=07 格式化磁碟機 (PC/XT HD Only)
同 AH=06 ,但會從指定之磁柱起開始格式化 9. AH=08 取得磁碟參數 (PC/AT PS/2)
DL=磁碟機 (軟碟 00-7F ,硬碟 80-FF)
返回代碼 :
成功則進位碼被清除
BL=磁碟機種類
01 360 KB ,40軌 , 5.25吋
02 1.2 MB ,80軌 , 5.25吋
03 720 KB ,80軌 , 3.5 吋
04 1.44MB ,80軌 , 3.5 吋
CH & CL = 最大磁軌數之 "低.高位元"
DH=磁頭數
DL=磁碟機數目
ES:DI 磁碟機參數表的 [分段:差距]
失敗 (同AH=07) 10 AH=09 (重設磁碟的特性)
DL=磁碟機碼 (PC/AT PS/2 HD Only)
INT_41h 需指向磁碟(HD)0的參數表
INT_46h 需指向磁碟(HD)1的參數表
返回代碼 :
成功 AH=00 ,清除進位
失敗 AH=狀態 (參考書籍 AH=01)
11 AH=0A 0B (讀/寫延伸磁區 HD Only)
AL=磁區數
CH=磁軌
CL=磁區
DH=磁頭
DL=磁碟機 (80h-FFh)
ES:BX = 緩衝區
返回代碼 :
成功 AH=00 ,清除進位
失敗 AH=狀態 (參考書籍 AH=01) 12. AH=0C (磁頭定位,但不讀寫資料)
CX=磁軌編號
DH=磁頭
DL=磁碟機 (80h-FFh)
返回代碼 :
成功 AH=00 ,清除進位
失敗 AH=狀態 (參考書籍 AH=01) 13. AH=0D (同 AH=00 只是僅將 HD 磁頭拉到第0軌)
AL=磁碟機代碼
返回代碼 :
成功 AH=00 ,清除進位
失敗 AH=狀態 (參考書籍 AH=01) 14. AH=0E 0F(讀/寫磁碟控制卡上的資料)
ES:BX 緩衝區
返回代碼 :
成功 AH=00 ,清除進位
失敗 AH=狀態 (參考書籍 AH=01)
只是將卡上的 BUFFERS 資料讀出 & 寫入BUFFER ,並不會動磁碟機 15. AH=10 (TEST)
DL=磁碟機 (80h-FFh HD Only)
返回代碼 :
成功 AH=00 ,清除進位
失敗 AH=狀態 (參考書籍 AH=01) 16. AH=11 (同 AH=00 只是僅將 HD 磁頭拉到第0軌)
AL=磁碟機代碼
返回代碼 :
成功 AH=00 ,清除進位
失敗 AH=狀態 (參考書籍 AH=01) 17. AH=12 (PC/XT HD CONTROL CARD RAM TEST)
返回代碼 :
成功 AH=00 ,清除進位
失敗 AH=狀態 (參考書籍 AH=01) 18. AH=13 (PC/XT HD CONTROL CARD TEST)
返回代碼 :
成功 AH=00 ,清除進位
失敗 AH=狀態 (參考書籍 AH=01) 19. AH=14 (PC/AT HD CONTROL CARD ALL TEST)
返回代碼 :
成功 AH=00 ,清除進位
失敗 AH=狀態 (參考書籍 AH=01) 20. AH=15 取得磁碟種類
DL=(軟碟00-7Fh ,硬碟80h-FFh)
返回代碼 :
成功 清除進位旗
AH=00 沒有磁碟
01 沒有支援變更列的軟碟
02 有支援變更列的軟碟
03 若是硬碟 ,CX:DX 長512位元組磁區數
失敗 AH=狀態 (參考書籍 AH=01) 21. AH=16 測試磁片是否抽換過 PC/AT Only
DL=磁碟機 (00-7F)
返回代碼 :
AH=00 未抽換 清除進位
AH=06 已抽換 設定進位 22. AH=17 設定磁碟種類
AL=00 未用
01 320/360KB 軟碟 (使用360KB驅動器)
02 320/360KB 軟碟 (使用1.2MB驅動器)
03 1.2MB 軟碟 (使用1.2MB驅動器)
04 720KB 軟碟 (使用720KB驅動器)
DL=磁碟機 (00-7F)
返回代碼 :
成功 AH=00 ,清除進位
失敗 AH=狀態 (參考書籍 AH=01) 23. AH=18 設定儲存媒體種類 (略) 24. AH=19 PARK (PS/2 Only)
DL=磁碟機 25. AH=1A FORMAT ESDI HD
------
︿︿ |
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
在 开 发 应 用 程 序 时, 增 加 一 项 显 示 计 算 机 系 统 信 息 的 功 能, 例 如 已 安 装 的 软 盘、 硬 盘、 光 驱、 网 络 驱 动 器, 硬 盘 的 容 量 和 剩 余 空 间, 显 示 器 分 辨 率、 键 盘 类 型、 鼠 标 的 键 数, 内 存 大 小、CPU 类 型,Windows 的 版 本 号、 产 品 标 识、 注 册 用 户 单 位 名 和 用 户 名、 当 前 操 作 用 户 名 等( 见 运 行 图 示), 当 然 还 有 更 多 的 信 息, 这 样 会 使 你 的 程 序 更 友 好。 其 实, 有 很 多 应 用 程 序 就 是 这 样 做 的。 通 过 调 用Windows 的API 函 数 和 访 问Windows 注 册 表, 可 以 获 取 大 量 的 系 统 信 息。Delphi 为 绝 大 多 数Windows API 函 数 提 供 了 调 用 接 口( 可 参 见DELPHI3\SOURCE\RTL\WIN\windows.pas 文 件), 并 提 供 了 一 个 功 能 全 面 的TRegistry 类, 使 我 们 可 以 方 便 的 调 用Windows API 函 数 和 访 问 注 册 表, 例 如: 1、function GetDriveType(lpRootPathName: PChar): UINT; 返 回 指 定 驱 动 器 的 类 型。 2、function GetDiskFreeSpace(lpRootPathName: PChar; var lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: DWORD): BOOL; 返 回 指 定 驱 动 器 的 总 簇 数、 剩 余 簇 数 及 每 簇 扇 区 数、 每 扇 区 字 节 数, 从 而 可 以 计 算 出 总 容 量 和 剩 余 空 间。 3、function GetSystemMetrics(SM_CXSCREEN或 SM_CYSCREEN): Integer; 返 回 显 示 器 分 辨 率。 4、function GetSystemMetrics(SM_CMOUSEBUTTONS): Integer; 返 回 鼠 标 的 按 键 数 目。 5、 在windows 注 册 表 的HKEY_LOCAL_MACHINE\ software\microsoft\windows\currentversion \RegisteredOwner 主 键 下 存 放 着Windows 安 装 时 输 入 的 用 户 名, 可 用 以 下 语 句 读 取。 myreg:=Tregistry.Create;
file://必须在程序单元的uses部分加入Registry
myreg.RootKey:=HKEY_LOCAL_MACHINE;
if myreg.openkey('software\microsoft \windows\currentversion',false) then
memo1.lines.add(' 注册用户名: ' myreg.readstring('RegisteredOwner'));
myreg.closekey; 以 上 仅 举 几 例, 获 取 其 他 一 些 信 息 的 方 法 与 此 类 似, 详 见 源 程 序。 本 程 序 在Pwin95、Delphi3 下 调 试 通 过。 附: 源 程 序 清 单。 unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Registry; type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation
{$R *.DFM} procedure TForm1.Button1Click(Sender: TObject);
var
i,x,y:integer;
ch:char; file://驱动器字符'A'~'Z'
buffer:string;
cpuinfo:TSYSTEMINFO; file://存放系统信息的记录类型,在Windows.pas中查到详细内容。
meminfo:TMemoryStatus; file://存放系统内存信息的记录类型。
computername,username:pchar; file://计算机名称、用户名
spc,bps,nofc,tnoc:longint; file://用于存放磁盘容量的变量
myreg:Tregistry; file://用于访问注册表的TRegistry变量
begin
memo1.Lines.Clear; for ch:='A' to 'Z' do begin
i:=getdrivetype(pchar(ch ':\'));
buffer:=' ' ch ': ';
case i of
DRIVE_UNKNOWN : buffer:=buffer '未知类型';
DRIVE_REMOVABLE: buffer:=buffer '软盘';
DRIVE_FIXED : begin
buffer:=buffer '硬盘';
if getdiskfreespace(pchar(ch ':\'),spc,bps,nofc,tnoc) then
begin
buffer:=buffer '总容量: ' inttostr((spc*bps*tnoc) div (1024*1024)) 'MB';
buffer:=buffer '剩余: ' inttostr((spc*bps*nofc) div (1024*1024)) 'MB';
end;
end;
DRIVE_REMOTE : buffer:=buffer '网络驱动器';
DRIVE_CDROM :buffer:=buffer 'CD-ROM驱动器';
DRIVE_RAMDISK:buffer:=buffer 'RAM虚拟驱动器';
end;
if (ch >'D') and (i=1) then break;
if i< >1 then memo1.Lines.Add(buffer);
end; case getkeyboardtype(0) of file://获取键盘类型
1: buffer:=' 键盘: IBM PC/XT或兼容类型(83键)';
2: buffer:=' 键盘: Olivetti "ICO"(102键)';
3: buffer:=' 键盘: IBM PC/AT(84键)';
4: buffer:=' 键盘: IBM增强型(101或102键)';
5: buffer:=' 键盘: Nokia 1050';
6: buffer:=' 键盘: Nokia 9140';
7: buffer:=' 键盘: Japanese';
end;
memo1.lines.add(buffer); file://获取键盘功能键数目
memo1.lines.add(' 功能键数目: ' inttostr(getkeyboardtype(2))); memo1.Lines.add('显示器分辨率: ' inttostr(getsystemmetrics(SM_CXSCREEN)) 'x'
inttostr(getsystemmetrics(SM_CYSCREEN)));
file://获取鼠标按键数目
memo1.Lines.add(' 鼠标: ' inttostr(getsystemmetrics(SM_CMOUSEBUTTONS)) '键'); globalmemorystatus(meminfo); file://获取系统内存数量
memo1.lines.add(' 物理内存: ' inttostr(meminfo.dwTotalPhys div 1024) ' KB'); i:=getsystemmetrics(SM_CLEANBOOT);
case i of
0:buffer:='系统启动模式:正常模式';
1:buffer:='系统启动模式:保护模式';
2:buffer:='系统启动模式:网络保护模式';
end;
memo1.lines.add(buffer); x:=getsystemmetrics(SM_ARRANGE);
file://获取系统最小化窗口的起始位置和排列方式
y:=x;
x:=x and 3;
y:=y and 12;
case x of
ARW_BOTTOMLEFT : buffer:=' 最小化窗口:自左下角';
ARW_BOTTOMRIGHT : buffer:=' 最小化窗口:自右下角';
ARW_TOPLEFT : buffer:=' 最小化窗口:自左上角';
ARW_TOPRIGHT : buffer:=' 最小化窗口:自右上角';
end;
case y of
ARW_LEFT : buffer:=buffer '横向排列';
ARW_UP : buffer:=buffer '纵向排列';
ARW_HIDE : buffer:=buffer '隐藏';
end;
memo1.lines.add(buffer); getmem(computername,255); file://获取计算机名称和用户名
getmem(username,255);
i:=255;
getcomputername(computername,i);
memo1.lines.add(' 计算机名称: ' computername);
getusername(username,i);
memo1.lines.add(' 用户名: ' username);
freemem(computername);
freemem(username); getsysteminfo(cpuinfo); file://获取CPU类型
case cpuinfo.dwProcessorType of
386 : buffer:=' CPU类型: 386';
486 : buffer:=' CPU类型: 486';
586 : buffer:=' CPU类型: Pentium';
end;
memo1.Lines.add(buffer); file://从注册表中获取CPU标识,Windows版本,
产品标识,注册单位名称及用户名
myreg:=Tregistry.Create;
myreg.RootKey:=HKEY_LOCAL_MACHINE;
if myreg.OpenKey('hardware\descriptionsystem\centralprocessor\0',false) then
memo1.lines.add(' CPU标识:
' myreg.ReadString('VendorIdentifier'));
myreg.closekey;
if myreg.openkey('software\microsoft\ windows\currentversion',false) then
begin
memo1.lines.add(' windows版本: ' myreg.ReadString('Version'));
memo1.lines.add(' 版本号: ' myreg.ReadString('VersionNumber') ' ' myreg.ReadString('Subversionnumber'));
memo1.lines.add(' 产品标识: ' myreg.Readstring('ProductID'));
memo1.lines.add('注册单位名称: ' myreg.readstring('RegisteredOrganization'));
memo1.lines.add(' 注册用户名: ' myreg.readstring('RegisteredOwner'));
end;
myreg.CloseKey;
myreg.Free;
end;
end
------
︿︿ |
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
c sir 大仔 真正是利害 msdn這東西 庵最不喜歡找 你居然找到 真正是 天下無敵 好好 收藏 哈哈< > 不知 ><>五體投地 佩服佩服< >>> *********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together!
希望能大家敞開心胸,將知識寶庫結合一起
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
dellee 庵也是前幾天自己由txt下去看才知道 庵被騙了 哈哈 不愧你為
嵌入之王哈哈 不過 庵有想個另一個方式 哈哈 就是dos 下送enter 來防止windows中斷 你知道庵 說的方式嗎? 討論討論 ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
lcsboy 哈哈
Jackkcg, 你問的不是RAID CARD上接的HDD 容量讀法嗎? <--- 重點沒給人家寫出來唷
庵 本想說要寫讀要RAID已經是 難了 你還加上 RAID 各種類 真正是 難上難 不愧為 bcb 的第一把 交椅 哈哈 倚天既出 屠龍未現 哈哈 *********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together!
希望能大家敞開心胸,將知識寶庫結合一起
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
Rain
資深會員 發表:31 回覆:236 積分:268 註冊:2003-02-17 發送簡訊給我 |
引言: 呼~~`這本書看起『好像』很LiHi的樣子 有人看過嗎,分享一下吧,不過好像是對岸的書 >>< face="Verdana, Arial, Helvetica"> 我手頭上有這本書,硬碟讀寫的示例程式已上傳至: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=32291 包括: Windows 9x下讀寫邏輯磁區的方法 Windows 9x下讀寫物理磁區——Ring0技術 Windows 9x下讀寫物理磁區——僅限軟碟 Windows 9x下讀寫物理磁區——實模式 Windows NT2000下讀寫物理邏輯磁區 讀寫磁片中打開的所有檔 如果需要原書的話我可以郵寄一本給你。 另外我不知道把書上面的程式放上來是否有所不妥, 不對的話jackkcg站長可在下載後一起刪除上面的帖子。 |
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
Rain 兄 無法進入你說的連結位置
如果需要原書的話我可以郵寄一本給你。
另外我不知道把書上面的程式放上來是否有所不妥,
不對的話jackkcg站長可在下載後一起刪除上面的帖子
你說的是 cmf 介紹的那本阿 多謝你的好意 至於是否 合法 我想應該看原作者內容把 我也沒看到 所以只有請你自己先看看原程式作者的宣告判斷把 謝謝 你的熱心幫忙 *********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together!
希望能大家敞開心胸,將知識寶庫結合一起
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
Rain
資深會員 發表:31 回覆:236 積分:268 註冊:2003-02-17 發送簡訊給我 |
示例程式是在隨書附贈光碟中的,在原書中只有關於書的版權說明,
另外在出版商的網站有提供大部分書籍的源代碼、常式下載:
http://www.fecit.com.cn/Pages/Guest.DD.L.P.asp,
只是還沒有這本書的(可能是因為新出不久的原因,不然我直接給
個位址就好),所以就姑且認為可以把它放上來,我再發個郵件
問一下,不行的話你再把它刪掉吧,另外剛才我是把文件放在會員個人專區上的
,這個區域是否只有我本人才可以訪問?我在會員分享文檔上傳區貼了一個,可以在那邊下載:http://delphi.ktop.com.tw/topic.php?TOPIC_ID=32307。
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
Rain 大仔的個人風範 實在應為 China 的標榜 本人除了 感謝 Rain的熱心幫忙 也對你的 個人處事風格 有信心 哈哈 至於 源碼部份 庵會通知 天使 評鑑一下是否可以 公開上傳 *********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together!
希望能大家敞開心胸,將知識寶庫結合一起
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
|
ufjjc
一般會員 發表:18 回覆:47 積分:23 註冊:2002-05-21 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |