标签: win64

写大文件

我尝试写一个大文件,但似乎它不适用于大于2GB的文件.我尝试过boost :: iostreams :: file_sink.这只是增强流的限制吗?还有其他方法我可以在Win64和win32上写一个大文件吗?

c++ file-io win64

11
推荐指数
2
解决办法
2819
查看次数

如何在64位Windows程序集中使用"GS:"(例如,移植TLS代码)

用户空间程序如何在64位Windows(当前为XP-64)下配置"GS:"?
(通过configure,将GS:0设置为任意64位线性地址).

我正在尝试将"JIT"环境移植到最初为Win32开发的X86-64.

一个不幸的设计方面是相同的代码需要在多个用户空间线程(例如,"光纤")上运行.代码的Win32版本使用GS选择器,并生成正确的前缀来访问本地数据 - "mov eax,GS:[offset]"指向当前任务的正确数据.来自Win32版本的代码会将值加载到GS中,只要它有一个可以工作的值.

到目前为止,我已经能够发现64位窗口不支持LDT,因此Win32下使用的方法不起作用.但是,X86-64指令集包括"SWAPGS",以及在不使用传统分段的情况下加载GS的方法 - 但这仅适用于内核空间.

根据X64手册,即使Win64允许访问描述符 - 它没有 - 但是没有办法设置段基的高32位.设置这些的唯一方法是通过GS_BASE_MSR(和相应的FS_BASE_MSR - 在64位模式下忽略其他段基).WRMSR指令是Ring0,所以我不能直接使用它.

我希望有一个Zw*函数,允许我在用户空间或Windows API的其他一些黑暗角落中更改"GS:".我相信Windows仍然使用FS:对于自己的TLS,所以必须有一些机制?


此示例代码说明了该问题.我提前为使用字节代码道歉 - VS不会为64位编译进行内联汇编,我试图将此作为一个文件保留用于说明目的.

程序在XP-32上显示"PASS",在XP-x64上不显示.


#include <windows.h>
#include <string.h>
#include <stdio.h>


unsigned char GetDS32[] = 
            {0x8C,0xD8,     // mov eax, ds
             0xC3};         // ret

unsigned char SetGS32[] =
            {0x8E,0x6C,0x24,0x04,   // mov gs, ss:[sp+4] 
             0xC3 };                // ret

unsigned char UseGS32[] = 
           { 0x8B,0x44,0x24,0x04,   // mov eax, ss:[sp+4] 
             0x65,0x8B,0x00,        // mov eax, gs:[eax] 
             0xc3 };                // ret

unsigned char SetGS64[] =
            {0x8E,0xe9,             // mov …
Run Code Online (Sandbox Code Playgroud)

assembly winapi win64 x86-64

10
推荐指数
1
解决办法
6304
查看次数

Windows 7 x64上的PyPy?

我试图在Windows 7 x64机器上使用PyPy,但没有找到任何方法来做到这一点.显然有一个win32二进制文件,但没有x64二进制文件或安装指南.我目前在win32上使用Python 2.7.2 win64(Python 2.7.2(默认,2011年6月12日,14:24:46)[MSC v.1500 64位(AMD64)].

从源代码安装引发了以下错误:

[translation:ERROR] WindowsError:[错误193]%1不是有效的Win32应用程序

有没有人有指导/提示在win64上使用PyPy?或者它是不可能的?

python win64 pypy

10
推荐指数
3
解决办法
9042
查看次数

64位vc ++程序似乎在32位模式下运行

我在Visual Studio 2010中创建了一个64位的c ++项目(在Windows 7 64bit下);

我以为我正在运行64位应用程序,以下代码返回true:

bool is64bit = (sizeof(void*)==8);
Run Code Online (Sandbox Code Playgroud)

但如果我调用该函数IsWow64Process,它返回FALSE ...

更奇怪的事情:

  • 打电话LoadLibrary()加载一个dll c:\windows\system32\some.dll工作得很好
  • 加载一个DLL c:\windows\sysWow64\some.dll将失败(错误代码193:some.dll不是一个有效的win32应用程序)

所有这些失败都表明应用程序在32位模式下运行,但这违背了指针类型为8字节长度的事实

我很困惑,任何帮助将不胜感激!

c++ win64

10
推荐指数
1
解决办法
353
查看次数

TRTTIContext多线程问题

我读过的所有内容都表明TRTTIContext是线程安全的.

但是,当多线程时,TRTTIContext.FindType似乎偶尔会失败(返回nil).在它周围使用TCriticalSection可以解决问题.请注意,我正在使用XE6,并且XE中似乎不存在该问题.编辑:似乎存在于所有具有新RTTI单元的Delphi版本中.

我已经编写了一个测试项目,你可以用来亲自看看.创建一个新的VCL项目,删除TMemo和TButton,用下面替换unit1,并分配Form1.OnCreate,Form1.OnDestroy和Button1.OnClick事件.密钥CS是TTestThread.Execute中的GRTTIBlock.目前已禁用,当我运行200个线程时,我得到3到5个失败.启用GRTTIBlock CS可以消除故障.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, SyncObjs, Contnrs, RTTI;

type
  TTestThread = class(TThread)
  private
    FFailed: Boolean;
    FRan: Boolean;
    FId: Integer;
  protected
    procedure Execute; override;
  public
    property Failed: Boolean read FFailed;
    property Ran: Boolean read FRan;
    property Id: Integer read FId write FId;
  end;

  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FThreadBlock: TCriticalSection;
    FMaxThreadCount: Integer;
    FThreadCount: Integer; …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading win64 rtti delphi-xe6

10
推荐指数
2
解决办法
1003
查看次数

将Delphi代码移植到64位 - 为什么没有编译器警告?

我们有一个很大的Delphi XE代码库,我们想要移植到64位.

我拥有Delphi XE2许可证,我找不到任何警告或提示,可以帮助我检测有效的32位结构,现在可以导致64位平台下的数据丢失.例如,对32位编译器完全有效的THandleCardinal赋值在编译Win64时不会引发任何警告.

当使用Delphi 2009迁移到Unicode时,我们有大量的警告帮助我们跟踪和修复可疑代码.有了XE2,我找不到任何东西.我无法想象在编译器级别上没有集成任何内容以避免我们对所有代码进行手动审查.

我错过了什么吗?如果你尝试过,你是如何将项目移植到64位的?

谢谢 !

windows delphi 64-bit win64 delphi-xe2

9
推荐指数
1
解决办法
1490
查看次数

AsyncPro和64bit

我正在运行Delphi XE8并安装了GetIt AsyncPro for VCL 1.0.当我编译32位应用程序但64位失败时,它工作正常.失败的是:

[dcc64 Error] OoMisc.pas(2771): E2065 Unsatisfied forward or external declaration: 'Trim'
Run Code Online (Sandbox Code Playgroud)

当我打开OoMisc.pas时看到:

{$IFNDEF Win32}
function Trim(const S : string) : string;
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

Trim功能似乎没有定义.该单位确实具有SysUtils其使用条款.

delphi win64

9
推荐指数
2
解决办法
650
查看次数

如何解决"%1不是有效的Win32应用程序"?

环境: 据说安装了
Windows Server 2003 R2 Enterprise 64位,SP2
.NET框架(2.0 SP2,3.0 SP2,3.5 SP1)

我说"应该",因为它们被列为已添加/删除程序下的安装.我不确定它是否正确安装,因为"ASP.NET"选项卡未添加到IIS中的任何站点.

在IIS Web服务扩展部分中,我同时拥有"ASP.NET v2.0.50727"(允许)和"ASP.NET v2.0.50727(32位)"(禁止).

有问题的网站启用了脚本执行.

问题:

我创建了一个超级简单的ASP.NET/C#网站:Default.aspx,标签为id ="Label1",后面是代码隐藏:Label1.text = "Hello World";我得到的错误是:

%1不是有效的Win32应用程序.

.net asp.net 64-bit configuration win64

8
推荐指数
2
解决办法
5万
查看次数

为什么Windows 64选择要求保存/恢复xmm6和xmm7?

为什么Windows 64选择要求保存/恢复xmm6和xmm7?

在Windows 32中,您可以编写破坏xmm0 ... xmm7的汇编例程.但是如果你使用相同的汇编代码并在Windows 64中运行它,它通常会导致应用程序错误,因为VS2007在xmm6和xmm7中存储了双精度值.

在我看来,由于X64有16个xmm寄存器xmm0 ... xmm15(而X32只有8个xmm寄存器),那么微软可能已经选择允许用户破解xmm0..xmm7(这样他们就可以重用Win32的汇编程序)不考虑它)但要求用户保存/恢复xmm8 ... xmm15.

那么,为了满足我自己的好奇心,为什么Windows 64选择要求保存/恢复xmm6和xmm7?

windows win64 cpu-registers

8
推荐指数
1
解决办法
1058
查看次数

Heat.exe无法从64位COM DLL中获取TypeLib信息

我有一个64位的COM DLL,我想使用heat.exe从中获取typelib信息.但是当我尝试这样做时,我得到错误193(错误的可执行格式).heat.exe只有32位,并且不能与64位可执行文件一起使用吗?我在我的机器上发现只有一个版本的heat.exe.

谢谢.

com win64 wix

7
推荐指数
1
解决办法
1800
查看次数