导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2019/10/9 11:38:03
标题:
求教以下C语句转DELPHI应该如何正确转换,感谢!
浏览:1384
加入我的收藏
楼主:
求教以下语句转DELPHI应该如何正确转换,感谢! FileRec=(PNTFS_FILE_RECORD_OUTPUT_BUFFER)VirtualAllocEx((HANDLE)-1,0,len,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE); FileRec是PNTFS_FILE_RECORD_OUTPUT_BUFFER结构。 这句里面 (HANDLE)-1 如何转换到DELPHI,感谢!!!!!!!!
----------------------------------------------
简单做人,认真做事。
作者:
2019/10/9 11:41:37
1楼:
我猜就是照抄。 FileRec := PNTFS_FILE_RECORD_OUTPUT_BUFFER(VirtualAllocEx(-1(看这个函数的类型定义), 0, len, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE));
----------------------------------------------
(C)(P)Flying Wang
作者:
2019/10/9 12:05:22
2楼:
提示越界 constant expression violates subrange bounds @wang_80919 看来照抄是不行的哈。
----------------------------------------------
简单做人,认真做事。
作者:
2019/10/9 12:07:03
3楼:
FileRec := PNTFS_FILE_RECORD_OUTPUT_BUFFER(VirtualAllocEx(THandle(-1), 0, len, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE));
----------------------------------------------
(C)(P)Flying Wang
作者:
2019/10/9 12:20:09
4楼:
typedef struct { LARGE_INTEGER FileReferenceNumber; DWORD FileRecordLength; BYTE FileRecordBuffer[1]; } NTFS_FILE_RECORD_OUTPUT_BUFFER, *PNTFS_FILE_RECORD_OUTPUT_BUFFER; @wang_80919 感谢!再请教下,以上是MSDN的结构定义, [color=#0000FF]FileRecordBuffer[1][/color] 这玩意怎么在DELPHI里面定义呢? 估计是我结构转换DELPHI有问题,所以下面返回总是出错。 if DeviceIoControl(hDrive, FSCTL_GET_NTFS_FILE_RECORD, @lFileID, Sizeof(LARGE_INTEGER), FileRec, ulBytes, ulBytes, 0) then
----------------------------------------------
简单做人,认真做事。
作者:
2019/10/9 12:28:31
5楼:
https://docs.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-deviceiocontrol https://www.delphipraxis.net/166704-createfile-deviceiocontrol-problem-mit-64bit.html https://stackoverflow.com/questions/4581387/delphi-using-deviceiocontrol-passing-ioctl-disk-get-length-info-to-get-flash-m https://jsproxy-demo.ml/-----https://www.google.com/search?source=hp&ei=mmKdXeG4Ioe-wAOrtpGQAw&q=delphi+DeviceIoControl&oq=delphi+DeviceIoControl&gs_l=psy-ab.12..0i30l4.574.574..2496...0.0..0.223.223.2-1......0....2j1..gws-wiz.jPUf9KTT3Yo&ved=0ahUKEwjh7cuOrI7lAhUHH3AKHStbBDIQ4dUDCAk
----------------------------------------------
[alias] co = clone --recurse-submodules up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/ >http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
2019/10/9 13:17:02
6楼:
楼主去找 Jedi api 这个 库,里头各种 WIN API 都帮你定义好了。
----------------------------------------------
(C)(P)Flying Wang
作者:
2019/10/9 15:05:03
7楼:
非常感谢 Flying Wang 兄弟!!!!!! 谢谢 keymark 兄弟提供的资料!
----------------------------------------------
简单做人,认真做事。
作者:
2019/10/9 16:07:46
8楼:
前面的全部调通了,还差最后两个函数,不会翻译成DELPHI。。。C基础太差,麻烦兄弟们帮忙看看怎么转为DELPHI的。 #define ReadResidentAttribute(Attribute) (void*)((ULONG_PTR)(Attribute)+((PRESIDENT_ATTRIBUTE)(Attribute))->ValueOffset) PATTRIBUTE GetNextAttribute(PFILE_RECORD_HEADER FileRecord,ATTRIBUTE_TYPE AttributeType,PATTRIBUTE CurrentPosition) { PATTRIBUTE Attribute; for(Attribute=CurrentPosition?(PATTRIBUTE)((ULONG_PTR)CurrentPosition+CurrentPosition->Length):(PATTRIBUTE)((ULONG_PTR)FileRecord+FileRecord->AttributesOffset);Attribute->AttributeType!=-1&&Attribute->AttributeType!=0;Attribute=(PATTRIBUTE)((ULONG_PTR)Attribute+Attribute->Length)) if(Attribute->AttributeType==AttributeType) return Attribute; return 0; }
----------------------------------------------
简单做人,认真做事。
作者:
2019/10/9 16:24:07
9楼:
有没有兄弟救命啊,实在看不懂。
----------------------------------------------
简单做人,认真做事。
作者:
2019/10/9 16:52:46
10楼:
这费劲的,你直接找人家delphi版的不就完了么。
----------------------------------------------
--
作者:
2019/10/9 17:14:32
11楼:
bahamut8348 兄弟,要能找到还费这个劲啊
----------------------------------------------
简单做人,认真做事。
作者:
2019/10/9 19:40:24
12楼:
GetNextAttribute 这是个循环吧 重要的是 if(Attribute->AttributeType==AttributeType) return Attribute; return 0;
----------------------------------------------
[alias] co = clone --recurse-submodules up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/ >http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
2019/10/10 14:30:20
13楼:
function ReadResidentAttribute(Attribute: Pointer): Pointer; begin Result := Pointer(ULONG_PTR(Attribute) + PRESIDENT_ATTRIBUTE(Attribute)^.ValueOffset); end; function GetNextAttribute(FileRecord: PFILE_RECORD_HEADER; AttributeType: ATTRIBUTE_TYPE; CurrentPosition: PATTRIBUTE): PATTRIBUTE; begin var Attribute: PATTRIBUTE; if (Attribute = CurrentPosition) then Attribute := PATTRIBUTE(ULONG_PTR(CurrentPosition) + CurrentPosition^.Length) else Attribute := PATTRIBUTE(ULONG_PTR(FileRecord) + FileRecord^.AttributesOffset); while (not (Attribute^.AttributeType in [-1, 0])) do begin if (Attribute^.AttributeType = AttributeType) then Exit(Attribute); Attribute := PATTRIBUTE(ULONG_PTR(Attribute) + Attribute^.Length); end; Result := nil; end;
----------------------------------------------
--
作者:
2019/10/10 22:14:21
14楼:
谢谢leonna兄弟,但执行结果不对,不知道函数哪里转换错了。
----------------------------------------------
简单做人,认真做事。
作者:
2019/10/10 22:20:15
15楼:
GetNextAttribute(FileRecord: PFILE_RECORD_HEADER; filerecord是一个mft表内的数据结构,这个结构中包含数据长度和文件内容。把filerecord直接存入文件会发现数据结构的其他属性和真实的文件数据都被存入文件,GetNextAttribute应该是从这个结构中把文件内容数据取出来。
----------------------------------------------
简单做人,认真做事。
作者:
2019/10/10 23:44:18
16楼:
代码结构上是没问题的,下个断点跟一下咯,看看是不是结构翻译有问题
----------------------------------------------
--
作者:
2019/10/12 12:16:16
17楼:
结构也没问题,用的是Jedi API库。 filerecord数据来自于获取到的buffer,是一个array of byte,把这个buffer直接写入文件,可以看到正确的文件内容被包含在文件内,内容前部和后部分应该是一个结构属性。包括文件格式,文件编号那些。 但怎么就取不到单独的文件数据
----------------------------------------------
简单做人,认真做事。