文件重命名的几种写法

现在主要的是通过往ZwSetInformationFile发送HANDLE和改名请求 
再者就是 往 IoSetInformation 发送FILEOBJECT和改名请求
以及我自己模仿iosetinformation写成的创建IRP改名

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

void

RenameFileROutineByHandle()

{

 UNICODE_STRING  UniFileString;

 OBJECT_ATTRIBUTES object;

 NTSTATUS   status;

 HANDLE    hFile;

 IO_STATUS_BLOCK  io_status = {0};

 PFILE_RENAME_INFORMATION RenamInfo = NULL;

 UNICODE_STRING  UniRenameStr;

 PFILE_OBJECT  fileObject;

 RtlInitUnicodeString(&UniFileString,L"\\Device\\HarddiskVolume2\\1.txt");

 

 InitializeObjectAttributes(

  &object,

  &UniFileString,

  OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,

  NULL,

  NULL);

 //打开文件,存在打开,不存在返回错误

 status = ZwCreateFile( &hFile,

  GENERIC_READ | GENERIC_WRITE,

  &object,

  &io_status,

  NULL,

  FILE_ATTRIBUTE_NORMAL,

  FILE_SHARE_READ,

  FILE_OPEN,

  FILE_NON_DIRECTORY_FILE |FILE_SYNCHRONOUS_IO_NONALERT,

  NULL,

  0);

 if(!NT_SUCCESS(status))

 {

  _asm int
3;

 }

 RenamInfo = (PFILE_RENAME_INFORMATION)ExAllocatePoolWithTag(NonPagedPool,1024,0);

 RenamInfo->ReplaceIfExists = FALSE;

 RenamInfo->RootDirectory = NULL;

 

 UniRenameStr.Buffer = RenamInfo->FileName;

 RenamInfo->FileNameLength = sizeof(ReNamePath) - sizeof(WCHAR);

 RtlCopyMemory(UniRenameStr.Buffer,ReNamePath,

  sizeof(ReNamePath));

 status = ZwSetInformationFile(hFile,&io_status,RenamInfo,1024,FileRenameInformation);

 if(!NT_SUCCESS(status))

 {

  _asm int
3;

 }

 ZwClose(hFile);

 return;

}

void

RenameFileROutineByObj()

{

 UNICODE_STRING  UniFileString;

 OBJECT_ATTRIBUTES object;

 NTSTATUS   status;

 HANDLE    hFile;

 IO_STATUS_BLOCK  io_status = {0};

 PFILE_RENAME_INFORMATION RenamInfo = NULL;

 UNICODE_STRING  UniRenameStr;

 PFILE_OBJECT  fileObject;

 RtlInitUnicodeString(&UniFileString,L"\\Device\\HarddiskVolume2\\1.txt");

 InitializeObjectAttributes(

  &object,

  &UniFileString,

  OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,

  NULL,

  NULL);

 //打开文件,存在打开,不存在返回错误

 status = ZwCreateFile( &hFile,

  GENERIC_READ | GENERIC_WRITE,

  &object,

  &io_status,

  NULL,

  FILE_ATTRIBUTE_NORMAL,

  FILE_SHARE_READ,

  FILE_OPEN,

  FILE_NON_DIRECTORY_FILE |FILE_SYNCHRONOUS_IO_NONALERT,

  NULL,

  0);

 if(!NT_SUCCESS(status))

 {

  _asm int
3;

 }

 RenamInfo = (PFILE_RENAME_INFORMATION)ExAllocatePoolWithTag(NonPagedPool,1024,0);

 RenamInfo->ReplaceIfExists = FALSE;

 RenamInfo->RootDirectory = NULL;

 UniRenameStr.Buffer = RenamInfo->FileName;

 RenamInfo->FileNameLength = sizeof(ReNamePath) - sizeof(WCHAR);

 RtlCopyMemory(UniRenameStr.Buffer,ReNamePath,

  sizeof(ReNamePath));

 ///////////////////////////////////////////////////////////

   status = ObReferenceObjectByHandle( hFile,

    0,

    *IoFileObjectType,

    KernelMode,

    &fileObject,

    NULL);

   if
(!NT_SUCCESS(status))

   {

    _asm int
3;

   }

  

   status = IoSetInformation( fileObject,

    FileRenameInformation,

    1024,

    RenamInfo);

   if
(!NT_SUCCESS(status))

   {

    _asm int
3;

   }

   

   ObDereferenceObject(fileObject);

 //////////////////////////////////////////////////////////

 ZwClose(hFile);

 return;

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void

RenameFileROutineByIrp()

{

UNICODE_STRING  UniFileString;

 OBJECT_ATTRIBUTES object;

 NTSTATUS   status;

 HANDLE    hFile;

 IO_STATUS_BLOCK  io_status = {0};

 PFILE_RENAME_INFORMATION RenamInfo = NULL;

 UNICODE_STRING  UniRenameStr;

 PFILE_OBJECT  FileObject;

 PDEVICE_OBJECT   deviceObject = NULL;

 PIRP     irp = NULL;

 KEVENT     event;

 IO_STATUS_BLOCK  localIoStatus;

 PIO_STACK_LOCATION  irpSp = NULL;

 UNICODE_STRING   newFileName;

 HANDLE    handle;

 PFILE_OBJECT   targetFileObject;

 RtlInitUnicodeString(&UniFileString,L"\\Device\\HarddiskVolume2\\1.txt");

 InitializeObjectAttributes(

  &object,

  &UniFileString,

  OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,

  NULL,

  NULL);

 //打开文件,存在打开,不存在返回错误

 status = ZwCreateFile( &hFile,

  GENERIC_READ | GENERIC_WRITE,

  &object,

  &io_status,

  NULL,

  FILE_ATTRIBUTE_NORMAL,

  FILE_SHARE_READ,

  FILE_OPEN,

  FILE_NON_DIRECTORY_FILE |FILE_SYNCHRONOUS_IO_NONALERT,

  NULL,

  0);

 if(!NT_SUCCESS(status))

 {

  _asm int
3;

 }

 RenamInfo = (PFILE_RENAME_INFORMATION)ExAllocatePoolWithTag(NonPagedPool,1024,0);

 RenamInfo->ReplaceIfExists = FALSE;

 RenamInfo->RootDirectory = NULL;

 UniRenameStr.Buffer = RenamInfo->FileName;

 RenamInfo->FileNameLength = sizeof(ReNamePath) - sizeof(WCHAR);

 RtlCopyMemory(UniRenameStr.Buffer,ReNamePath,

  sizeof(ReNamePath));

 status = ObReferenceObjectByHandle( hFile,

    0,

    *IoFileObjectType,

    KernelMode,

    &FileObject,

    NULL);

 if
(!NT_SUCCESS(status))

 {

   _asm int
3;

 }

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////

// 以下为iosetinformationfile

 ObReferenceObject( FileObject ); 

 KeInitializeEvent( &event, SynchronizationEvent, FALSE );

 deviceObject = IoGetRelatedDeviceObject( FileObject );

  

 irp = IoAllocateIrp( deviceObject->StackSize, TRUE );

    if
(!irp)

 {

  _asm int
3;

 }

 

 irp->Tail.Overlay.OriginalFileObject = FileObject;

    irp->Tail.Overlay.Thread = PsGetCurrentThread();

    irp->RequestorMode = KernelMode;

 

 irp->UserEvent = &event;

    irp->Flags = IRP_SYNCHRONOUS_API;

 

    irp->UserIosb = &localIoStatus;

 

    irpSp = IoGetNextIrpStackLocation( irp );

    irpSp->MajorFunction = IRP_MJ_SET_INFORMATION;

    irpSp->FileObject = FileObject;

 

 

 irp->AssociatedIrp.SystemBuffer = RenamInfo;

    irp->Flags |= IRP_BUFFERED_IO;

 

 irpSp->Parameters.SetFile.Length = 1024;

    irpSp->Parameters.SetFile.FileInformationClass = FileRenameInformation;

 

 irpSp->Parameters.SetFile.ReplaceIfExists = RenamInfo->ReplaceIfExists;

 

 if
(RenamInfo->FileName[0] == (UCHAR) OBJ_NAME_PATH_SEPARATOR ||

            RenamInfo->RootDirectory != NULL)

 {

 /////////////////////////////////////////////////////////

 // 以下IopOpenLinkOrRenameTarget

  ACCESS_MASK   accessMask = FILE_WRITE_DATA;

  OBJECT_ATTRIBUTES  objectAttributes;

  IO_STATUS_BLOCK  ioStatus;

  OBJECT_HANDLE_INFORMATION  handleInformation;

  

  newFileName.Length = (USHORT) RenamInfo->FileNameLength;

  newFileName.MaximumLength = (USHORT) RenamInfo->FileNameLength;

  newFileName.Buffer = RenamInfo->FileName;

  

  InitializeObjectAttributes( &objectAttributes,

                                &newFileName,

                                OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,

                                NULL,

                                NULL );

        

  status = IoCreateFile( &handle,

                               FILE_WRITE_DATA | SYNCHRONIZE,

                               &objectAttributes,

                               &ioStatus,

                               (PLARGE_INTEGER) NULL,

                               0,

                               FILE_SHARE_READ | FILE_SHARE_WRITE,

                               FILE_OPEN,

                               FILE_OPEN_FOR_BACKUP_INTENT,

                               (PVOID) NULL,

                               0L,

                               CreateFileTypeNone,

                               (PVOID) NULL,

          //IO_OPEN_TARGET_DIRECTORY |

                               IO_NO_PARAMETER_CHECKING |

          0x0004 |

                               IO_FORCE_ACCESS_CHECK ); 

  if(!NT_SUCCESS(status))

  {

   _asm int
3;

  }

  status = ObReferenceObjectByHandle( handle,

                                              accessMask,

                                              *IoFileObjectType,

                                              KernelMode,

                                              (PVOID *) &targetFileObject,

                                              &handleInformation ); 

  

   

  if(!NT_SUCCESS(status))

  {

   _asm int
3;

  }

  ObDereferenceObject( targetFileObject );

  

                if
(IoGetRelatedDeviceObject( targetFileObject) !=

                    IoGetRelatedDeviceObject( FileObject )) {

                    _asm int
3;

                } else
{

                    irpSp->Parameters.SetFile.FileObject = targetFileObject;

                    //*TargetHandle = handle;

                    status = STATUS_SUCCESS;

                }     

 }

 // 以上IopOpenLinkOrRenameTarget

 /////////////////////////////////////////////////////

 status = IoCallDriver( deviceObject, irp );

 if
(status == STATUS_PENDING)

  KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, 0);

 if(!NT_SUCCESS(status))

 {

  _asm int
3;

 }

 

 ZwClose( handle);

//  以上为IOSETINFORMATIONFILE

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 ZwClose(hFile);

 ObDereferenceObject(FileObject);

 return
STATUS_SUCCESS;

}

文件重命名的几种写法,布布扣,bubuko.com

时间: 2024-10-25 07:54:10

文件重命名的几种写法的相关文章

Linux rename命令文件重命名的用法汇总

Linux命令中的rename命令主要用于给文件重命名,与mv命令有些类似,但rename可以对批量文件进行重命名,而mv命令则只能对单个文件重命名,下面就给大家详细介绍下Linux rename命令的使用方法吧. Linux的 rename 命令有两个版本,一个是C语言版本的,一个是Perl语言版本的,早期的Linux发行版基本上使用的是C语言版本的,现在已经很难见到C语言版本的了,由于历史原因,在Perl语言大红大紫的时候,Linux的工具开发者们信仰Perl能取代C,所以大部分工具原来是C

Linux下文件重命名、创建、删除、修改及保存文件

一.重命名(更名) linux 给文件改名的命令是mv命令 mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中.该命令等同于DOS系统下的ren和move命令的组合.它的使用权限是所有用户. 格式mv [options] 源文件或目录 目标文件或目录.主要参数[options]-i:交互方式操作.如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答”y”或”n”,这样可以避免误覆盖文件. -f:禁止交互操作.mv操作要覆盖某个已有的目标文件时不给任何指示,指定

文件重命名之动态修改ListView里指定Item中的组件属性

在Android实际开发过程中经常会遇到,修改ListView中某一项的值.如何达到这一目的呢? 方法主要有两种: 第一种方式:当ListView中某一项的值发生变化之后,重新加载数据已达到更新ListView的目的. 虽然第一种方式能够解决问题,但不值得推荐.因为这样会带来不必要的资源消耗.在移动终端这种硬件资源和计算能力都有限的情况下,显然有点得不偿失了,况且用户的体验也不好. 第二种方式:第二种方式可以说是第一种方式的改进.ListView中某一项的值发生改变,实际上是ListView的数

巧妙地解决Java文件重命名失败的问题

一.问题描述 1.大家在用log4j时,可能会遇到下面的一个报错信息: Failed to rename [/opt/proj.log] to [/opt/proj.log.2014-03-20]. 这个算是log4j.DailyRollingFileAppender的一个BUG,网上很多修改方案,不过我能搜到的,都不理想. 2.一般性问题:文件重命名失败 详细的内容可以参见论坛的帖子:http://bbs.csdn.net/topics/330195396 关键内容如下: 我也遇到了和LZ相同

利用datafile copy将数据文件重命名

思路: o 利用RMAN对数据文件做copy o 将数据文件offline o switch文件名,这一步将更改控制文件中数据文件对应的文件名 o recover数据文件 o 将数据文件online,恢复生产 注:也可以利用这种思路做DATABASE COPY,然后做SWITCH DATABASE,迁移数据库... 实验过程如下: ====================================== SQL> archive log list; Database log mode    

java 获取文件名(不包括文件的后缀)和文件重命名

获取文件名(不包括后缀) originalFileName.substring(0, originalFileName.lastIndexOf(".")) 文件重命名 public void renameFile(String file, String toFile) { File toBeRenamed = new File(file); //检查要重命名的文件是否存在,是否是文件 if (!toBeRenamed.exists() || toBeRenamed.isDirector

oc NSFileManager 文件夹创建、文件移动、文件复制、文件重命名

// 初始化管理类 NSFileManager * manager = [NSFileManager defaultManager]; // 路径 NSString * DirectoryPath = [NSHomeDirectory() stringByAppendingPathComponent:@"/desktop/我的文件夹1/我的文件夹2"]; NSError * error = nil; if ([manager createDirectoryAtPath:Director

ListView 文件重命名

unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, ComCtrls, StdCtrls; type   TForm1 = class(TForm)     ListView1: TListView; ListView2: TListView; Button1: TButton; Edit1: TEdit; Edit2:

Java用来进行批量文件重命名,批量提取特定类型文件

原因: 因为在网上下载视频教程,有的名字特别长,一般都是机构或者网站的宣传,不方便直接看到视频的简介,所以做了下面的第一个功能. 因为老师发的课件中,文件夹太多,想把docx都放在同一个文件夹下面,一个一个找出来太麻烦,所以做了第二个功能.       最近刚刚学了Java文件和流的知识,所以正好练练手,这也是自己的第一个exe程序,分享一下哈. (导出jar文件,以及用工具exe4j生成exe文件,这部分省略了哈) 用到的知识: 用到Java中文件,流的知识,以及简单的GUI知识. 功能: