Delphi 下深入windows核心编程 一书中有这么一个例子,可是在我的电脑上就是搞不出来,我怎么看也没有看明白,不过我的水平太低了,现在我只想找这么一个东西,不知道哪位高人有呀贴上《Delphi 下深入windows核心编程》中的源码:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, FileCtrl, Buttons, ExtCtrls;const
// Access modes
  OPEN_ACCESS_READONLY = $0000;
  OPEN_ACCESS_WRITEONLY = $0001;
  OPEN_ACCESS_READWRITE = $0002;
  OPEN_ACCESS_RO_NOMODLASTACCESS = $0004;
// Share modes
  OPEN_SHARE_COMPATIBLE = $0000;
  OPEN_SHARE_DENYREADWRITE = $0010;
  OPEN_SHARE_DENYWRITE = $0020;
  OPEN_SHARE_DENYREAD = $0030;
  OPEN_SHARE_DENYNONE = $0040;
// Open flags
  OPEN_FLAGS_NOINHERIT = $0080;
  OPEN_FLAGS_NO_BUFFERING = $0100;
  OPEN_FLAGS_NO_COMPRESS = $0200;
  OPEN_FLAGS_ALIAS_HINT = $0400;
  OPEN_FLAGS_NOCRITERR = $2000;
  OPEN_FLAGS_COMMIT = $4000;
// File types
  FILENORMAL = $0000;
  MEMORYMAPPED = $0001;
  DLLOREXECUTABLE = $0002;
  SWAPFILE = $0004;
type
  P32Regs = ^T32Regs; //32位寄存器结构
  T32Regs = record
    EBX: Longint;
    EDX: Longint;
    ECX: Longint;
    EAX: Longint;
    EDI: Longint;
    ESI: Longint;
    Flags: Longint;
  end;
  TOpenFileinfo = record //已打开文件的结构
    openflag: integer;
    filetype: integer;
    filename: array[0..256] of char;
  end;
  POpenFileinfo = ^TOpenFileinfo;
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    ComboBox1: TComboBox;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FHandle: Thandle;
  public
    function EnumOpenFile(volume: byte; index: integer; var
      Fileinfo: TOpenFileinfo; Enumtype: integer = 0): boolean;
  end;var
  Form1: TForm1;implementation{$R *.DFM}const
  VWIN32_DIOC_DOS_IOCTL = 1; {MS-DOS Int21h 44xxh functions call}
function Tform1.EnumOpenFile(volume: byte; index: integer; var Fileinfo:
  TOpenFileinfo; Enumtype: integer = 0): boolean;
   //枚举磁盘正在使用的文件
var
  R: T32Regs;
  cb: DWord;
begin
  fillchar(r, sizeof(r), 0);
  R.EAX := $440D;
  R.EBX := Volume;
  R.ECX := $086D;
  R.EDX := integer(@fileinfo.filename);
  R.ESI := index;
  R.EDI := Enumtype;
  //列举全部正在运行的文件
  DeviceiOControl(FHandle, VWIN32_DIOC_DOS_IOCTL, @R, SizeOf(R), @R,
    SizeOf(R), cb, nil);
  fileinfo.openflag := r.EAX;
  fileinfo.filetype := r.ECX;
  Result := (R.Flags and 1) = 0;
end;procedure TForm1.BitBtn1Click(Sender: TObject);
var
  DriveNum: byte;
  DriveChar: Char;
  DriveType: TDriveType;
  DriveBits: set of 0..25;
  FileInfo: TOpenFileinfo;
  k: integer;
  FileType, FileOpenFlags: string;
begin
  Listbox1.items.clear;
  try
    Integer(DriveBits) := GetLogicalDrives; //获取逻辑盘
    for DriveNum := 0 to 25 do //检索所有的盘
    begin
      if not (DriveNum in DriveBits) then Continue;
      DriveChar := Char(DriveNum + Ord('A'));
      if (Combobox1.items[Combobox1.itemindex] <> '全部') and
        (Combobox1.items[Combobox1.itemindex][1] <> DriveChar) then
        continue;
      DriveType := TDriveType(GetDriveType(PChar(DriveChar + ':\')));
      case DriveType of
        dtFixed: //如果是硬盘
          begin
            k := 0;
            while EnumOpenFile(DriveNum + 1, k, Fileinfo, 0) do //循环列举所有已打开的文件
            begin
              case LoWord(FileInfo.filetype) of
                FILENORMAL: FileType := '普通';
                MEMORYMAPPED: FileType := '内存映象';
                DLLOREXECUTABLE: FileType := '可执行模块';
                SWAPFILE: FileType := '交换文件';
              else FileType := '未知';
              end;              FileOpenFlags := '';
              if (LOWORD(FileInfo.openflag) and OPEN_ACCESS_RO_NOMODLASTACCESS) <> 0 then
                FileOpenFlags := FileOpenFlags + '未知,'
              else if (LOWORD(FileInfo.openflag) and OPEN_ACCESS_READWRITE) <> 0 then
                FileOpenFlags := FileOpenFlags + '读写,'
              else if (LOWORD(FileInfo.openflag) and OPEN_ACCESS_WRITEONLY) <> 0 then
                FileOpenFlags := FileOpenFlags + '只写,'
              else FileOpenFlags := FileOpenFlags + '只读,';              if (LOWORD(FileInfo.openflag) and OPEN_SHARE_DENYNONE) <> 0 then
                FileOpenFlags := FileOpenFlags + '不屏蔽,'
              else if (LOWORD(FileInfo.openflag) and OPEN_SHARE_DENYWRITE) <> 0 then
                FileOpenFlags := FileOpenFlags + '屏蔽写,'
              else if (LOWORD(FileInfo.openflag) and OPEN_SHARE_DENYREAD) <> 0 then
                FileOpenFlags := FileOpenFlags + '屏蔽读,'
              else if (LOWORD(FileInfo.openflag) and OPEN_SHARE_DENYREADWRITE) <> 0 then
                FileOpenFlags := FileOpenFlags + '屏蔽读写,'
              else FileOpenFlags := FileOpenFlags + '兼容,';              if (LOWORD(FileInfo.openflag) and OPEN_FLAGS_COMMIT) <> 0 then
                FileOpenFlags := FileOpenFlags + '提交'
              else if (LOWORD(FileInfo.openflag) and OPEN_FLAGS_NOCRITERR) <> 0 then
                FileOpenFlags := FileOpenFlags + '非临界'
              else if (LOWORD(FileInfo.openflag) and OPEN_FLAGS_ALIAS_HINT) <> 0 then
                FileOpenFlags := FileOpenFlags + '别名'
              else if (LOWORD(FileInfo.openflag) and OPEN_FLAGS_NO_COMPRESS) <> 0 then
                FileOpenFlags := FileOpenFlags + '不压缩'
              else if (LOWORD(FileInfo.openflag) and OPEN_FLAGS_NO_BUFFERING) <> 0 then
                FileOpenFlags := FileOpenFlags + '没有缓冲区'
              else if (LOWORD(FileInfo.openflag) and OPEN_FLAGS_NOINHERIT) <> 0 then
                FileOpenFlags := FileOpenFlags + '不继承'
              else FileOpenFlags := FileOpenFlags + '-';              Listbox1.items.Add(format('%-10s %-28s%s', [FileType, FileOpenFlags, fileinfo.filename]));
              k := k + 1;
            end;
          end;
      end;
    end;
  except
  end;
end;procedure TForm1.FormCreate(Sender: TObject);
var
  DriveNum: Integer;
  DriveChar: Char;
  DriveType: TDriveType;
  DriveBits: set of 0..25;
begin
  SendMessage(ListBox1.Handle, LB_SetHorizontalExtent, 700, longint(0));
  combobox1.clear;
  Integer(DriveBits) := GetLogicalDrives;
  for DriveNum := 0 to 25 do
  begin
    if not (DriveNum in DriveBits) then Continue;
    DriveChar := Char(DriveNum + Ord('A')); //从a---z
    DriveType := TDriveType(GetDriveType(PChar(DriveChar + ':\')));
    case DriveType of
      dtFixed: combobox1.Items.Add(DriveChar + ':');
    end;
  end;
  combobox1.Items.Add('全部');
  Combobox1.itemindex := Combobox1.Items.count - 1;  FHandle := CreateFile('VWIN32.txt', GENERIC_READ or GENERIC_WRITE,
    FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if FHandle = INVALID_HANDLE_VALUE then halt;
end;procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  close;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if FHandle <> 0 then
    CloseHandle(Fhandle);
end;end.

解决方案 »

  1.   

    VWIN32.txt要先建立起来
      FHandle := CreateFile('I:\zzzzzz\OpenAllFiles\VWIN32.txt', GENERIC_READ or GENERIC_WRITE,
        FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
      

  2.   

    'I:\zzzzzz\OpenAllFiles\VWIN32.txt',你用自己的路径,我试了,能运行
      

  3.   

    FHandle := CreateFile('VWIN32.txt', GENERIC_READ or GENERIC_WRITE,
        FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    这一句我搞错了,应该是 FHandle := CreateFile('\\.\VWIN32', GENERIC_READ or GENERIC_WRITE,
        FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);VWIN32是一个系统上的东西,不能是自己的东西,不好意思,我改了以后没有改过来
      

  4.   

    TO:pandengzhe(无为之为 之 混迹苍生) :不会是死循环吗
      

  5.   

    好像只用用于win9x,你有vwin32.vxd 文件么?
      

  6.   

    FileOpenFlags := FileOpenFlags + '不继承'
                  else FileOpenFlags := FileOpenFlags + '-';              Listbox1.items.Add(format('%-10s %-28s%s', [FileType, FileOpenFlags, fileinfo.filename]));
                  k := k + 1;
    //加个次数限制
    if k>100 then Exit;
      

  7.   

    我也觉得有问题,可能是系统不同
    打开文件应该可以知道是否打开,不用DeviceiOControl