大理寺少卿 发表于 2025-3-4 22:30:26

驱动开发与系统原理-删除拷贝剪切

删除

```

      #define CTL_DELETE_PATH IRP_IOCTRL_CODE(5)
      #define CTL_COPY_SPATH IRP_IOCTRL_CODE(6)
      #define CTL_COPY_DPATH IRP_IOCTRL_CODE(7)
      #define CTL_MOVE_SPATH IRP_IOCTRL_CODE(8)
      #define CTL_MOVE_DPATH IRP_IOCTRL_CODE(9)

            ...
            ...
       //删除文件的函数实现
      NTSTATUS DeleteFileIoCall(char* filePath) {
                NTSYSAPI NTSTATUS ZwDeleteFile(
                   POBJECT_ATTRIBUTES ObjectAttributes
                );
                //状态码
                NTSTATUS ntSTATUS = STATUS_SUCCESS;
                //文件句柄
                HANDLE hFile = NULL;
                //完成状态
                IO_STATUS_BLOCK Iostatus = { 0 };
                //对象属性
                OBJECT_ATTRIBUTES ObjectAtt = { 0 };
                //三环c:\a.txt
                //0环:\\??\\c:\a.txt
                //将三环路径转换成驱动使用的路径
                ANSI_STRING asFilePath = { 0 };
                UNICODE_STRING usFilePath = { 0 };
                UNICODE_STRING usDriverFilePath = { 0 };
                UNICODE_STRING usDrvPath = { 0 };
                WCHARwcBuffer;
                ULONG wcbufferLen = 256 * sizeof(WCHAR);
                RtlInitEmptyUnicodeString(&usDrvPath, &wcBuffer, wcbufferLen);
                RtlInitUnicodeString(&usDriverFilePath, L"\\??\\");
                RtlInitAnsiString(&asFilePath, filePath);
                RtlAnsiStringToUnicodeString(&usFilePath, &asFilePath, TRUE);
                RtlAppendUnicodeStringToString(&usDrvPath, &usDriverFilePath);
                RtlAppendUnicodeStringToString(&usDrvPath, &usFilePath);
                RtlFreeUnicodeString(&usFilePath);

                InitializeObjectAttributes(&ObjectAtt, &usDrvPath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
                ntSTATUS = ZwDeleteFile(&ObjectAtt);
                return ntSTATUS;

            }
         
            //复制文件的函数实现
               NTSTATUS CopyFileIoCall(char *szFilePath) {//目的路径
            //1.读取文件
            ReadFileIoCall(g_FilePath);//全局路径,如果直接写就写回去了,我们得修改全局路径
            RtlZeroMemory(g_FilePath, 0x256);
            ULONG uDFillPathLength = strlen(szFilePath);
            RtlCopyMemory(g_FilePath, szFilePath, uDFillPathLength);
            //2.写入文件
            WriteFileIoCall(g_Buffer);
               }   
            
             //文件操作-移动文件
            NTSTATUS MoveFileIoCall(char* szFilePath) {//目的路径
                  //1.读取文件
                  ReadFileIoCall(g_FilePath);//全局路径,如果直接写就写回去了,我们得修改全局路径
                  //源文件删除
                  DeleteFileIoCall(g_FilePath);//就多了一行删除文件
                  RtlZeroMemory(g_FilePath, 0x256);
                  ULONG uDFillPathLength = strlen(szFilePath);
                  RtlCopyMemory(g_FilePath, szFilePath, uDFillPathLength);
                  //2.写入文件
                  WriteFileIoCall(g_Buffer);
                   }
            
            ...
            ...
            
            case CTL_DELETE_PATH: {
            ntStatus = DeleteFileIoCall(pInputBuffer);
            if (NT_SUCCESS(ntStatus))
            {
                  RtlZeroMemory(pOutputBuffer, 1024);
                  ULONG uRetlength = strlen("Delete Success!");
                  RtlCopyMemory(pOutputBuffer, "Delete Success!", uRetlength);
                  pIrp->IoStatus.Status = STATUS_SUCCESS;
                  pIrp->IoStatus.Information = uRetlength;
                  IoCompleteRequest(pIrp, IO_NO_INCREMENT);
            }
            else {
                  RtlZeroMemory(pOutputBuffer, 1024);
                  ULONG uRetlength = strlen("Delete Failed!");
                  RtlCopyMemory(pOutputBuffer, "Delete Failed!", uRetlength);
                  pIrp->IoStatus.Status = STATUS_SUCCESS;
                  pIrp->IoStatus.Information = uRetlength;
                  IoCompleteRequest(pIrp, IO_NO_INCREMENT);

            }
            return STATUS_SUCCESS;
          }

                case CTL_COPY_SPATH: {
                  RtlZeroMemory(g_FilePath, 0x256);
                  RtlCopyMemory(g_FilePath, pInputBuffer, uInputLength);
                  RtlZeroMemory(pOutputBuffer, 1024);
                  ULONG uRetlength = strlen("Success!");
                  RtlCopyMemory(pOutputBuffer, "Success!", uRetlength);
                  pIrp->IoStatus.Status = STATUS_SUCCESS;
                  pIrp->IoStatus.Information = uRetlength;
                  IoCompleteRequest(pIrp, IO_NO_INCREMENT);
                  return STATUS_SUCCESS;
                }

                case CTL_COPY_DPATH: {
                  ntStatus = CopyFileIoCall(pInputBuffer);
                  if (NT_SUCCESS(ntStatus))
                  {
                        RtlZeroMemory(pOutputBuffer, 1024);
                        ULONG uRetlength = strlen("Copy Success!");
                        RtlCopyMemory(pOutputBuffer, "Copy Success!", uRetlength);
                        pIrp->IoStatus.Status = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = uRetlength;
                        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
                  }
                  else {
                        RtlZeroMemory(pOutputBuffer, 1024);
                        ULONG uRetlength = strlen("Copy Failed!");
                        RtlCopyMemory(pOutputBuffer, "Copy Failed!", uRetlength);
                        pIrp->IoStatus.Status = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = uRetlength;
                        IoCompleteRequest(pIrp, IO_NO_INCREMENT);

                  }
                  return STATUS_SUCCESS;
                }
            
                  case CTL_MOVE_SPATH: {
                  RtlZeroMemory(g_FilePath, 0x256);
                  RtlCopyMemory(g_FilePath, pInputBuffer, uInputLength);
                  RtlZeroMemory(pOutputBuffer, 1024);
                  ULONG uRetlength = strlen("Success!");
                  RtlCopyMemory(pOutputBuffer, "Success!", uRetlength);
                  pIrp->IoStatus.Status = STATUS_SUCCESS;
                  pIrp->IoStatus.Information = uRetlength;
                  IoCompleteRequest(pIrp, IO_NO_INCREMENT);
                  return STATUS_SUCCESS;
               }

                  case CTL_MOVE_DPATH: {
                      ntStatus = MoveFileIoCall(pInputBuffer);
                      if (NT_SUCCESS(ntStatus))
                      {
                        RtlZeroMemory(pOutputBuffer, 1024);
                        ULONG uRetlength = strlen("Move Success!");
                        RtlCopyMemory(pOutputBuffer, "Move Success!", uRetlength);
                        pIrp->IoStatus.Status = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = uRetlength;
                        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
                      }
                      else {
                        RtlZeroMemory(pOutputBuffer, 1024);
                        ULONG uRetlength = strlen("Move Failed!");
                        RtlCopyMemory(pOutputBuffer, "Move Failed!", uRetlength);
                        pIrp->IoStatus.Status = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = uRetlength;
                        IoCompleteRequest(pIrp, IO_NO_INCREMENT);

                      }
                      return STATUS_SUCCESS;
                  }
               
```

3环代码

```

               
                  #define CTL_DELETE_PATH IRP_IOCTRL_CODE(5)
                  #define CTL_COPY_SPATH IRP_IOCTRL_CODE(6)
                  #define CTL_COPY_DPATH IRP_IOCTRL_CODE(7)
                  #define CTL_MOVE_SPATH IRP_IOCTRL_CODE(8)
                  #define CTL_MOVE_DPATH IRP_IOCTRL_CODE(9)

                  ...
                  ...
                  case'4':
                      {
                        memset(Sfilepath, 0, sizeof(InputBuffer));
                        memset(Dfilepath, 0, sizeof(OutputBuffer));
                        memset(OutputBuffer, 0, sizeof(OutputBuffer));
                        printf("请输入源文件的路径:\n");
                        scanf("%s", Sfilepath);
                        printf("\n请输入目的文件路径:\n");
                        scanf("%s", Dfilepath);
                        DeviceIoControl(hDriver, CTL_COPY_SPATH, Sfilepath, sizeof(Sfilepath), OutputBuffer, sizeof(OutputBuffer), &RetNumber, NULL);
                        if (!strcmp(OutputBuffer, "Success!"))
                        {
                        memset(OutputBuffer, 0, sizeof(OutputBuffer));
                        DeviceIoControl(hDriver, CTL_COPY_DPATH, Dfilepath, sizeof(Dfilepath), OutputBuffer, sizeof(OutputBuffer), &RetNumber, NULL);
                        printf("%s\n", OutputBuffer);
                        system("pause");
                        }

                        break;
                      }

                      case '5': {
                        RetNumber = 0;
                        memset(InputBuffer, 0, sizeof(InputBuffer));
                        memset(OutputBuffer, 0, sizeof(OutputBuffer));
                        printf("请输入需要删除的文件路径:\n");
                        scanf("%s", InputBuffer);
                        DeviceIoControl(hDriver, CTL_DELETE_PATH, InputBuffer, sizeof(InputBuffer), OutputBuffer, sizeof(OutputBuffer), &RetNumber, NULL);
                        printf("返回数据: % s\n", OutputBuffer);
                        system("pause");       
                        break;
                      }
                  
                        case'7': {
                        memset(Sfilepath, 0, sizeof(InputBuffer));
                        memset(Dfilepath, 0, sizeof(OutputBuffer));
                        memset(OutputBuffer, 0, sizeof(OutputBuffer));
                        printf("请输入源文件的路径:\n");
                        scanf("%s", Sfilepath);
                        printf("\n请输入目的文件路径:\n");
                        scanf("%s", Dfilepath);
                        DeviceIoControl(hDriver, CTL_MOVE_SPATH, Sfilepath, sizeof(Sfilepath), OutputBuffer, sizeof(OutputBuffer), &RetNumber, NULL);
                        if (!strcmp(OutputBuffer, "Success!"))
                        {
                        memset(OutputBuffer, 0, sizeof(OutputBuffer));
                        DeviceIoControl(hDriver, CTL_MOVE_DPATH, Dfilepath, sizeof(Dfilepath), OutputBuffer, sizeof(OutputBuffer), &RetNumber, NULL);
                        printf("%s\n", OutputBuffer);
                        system("pause");
                        }

                        break;
                      }
```

**复制文件**

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211206201609.png)

**删除文件**

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211206201805.png)

**移动文件**

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211206201952.png)
页: [1]
查看完整版本: 驱动开发与系统原理-删除拷贝剪切