我尝试写一个大文件,但似乎它不适用于大于2GB的文件.我尝试过boost :: iostreams :: file_sink.这只是增强流的限制吗?还有其他方法我可以在Win64和win32上写一个大文件吗?
用户空间程序如何在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,所以必须有一些机制?
程序在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) 我试图在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?或者它是不可能的?
我在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
工作得很好c:\windows\sysWow64\some.dll
将失败(错误代码193:some.dll不是一个有效的win32应用程序)所有这些失败都表明应用程序在32位模式下运行,但这违背了指针类型为8字节长度的事实
我很困惑,任何帮助将不胜感激!
我读过的所有内容都表明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 XE代码库,我们想要移植到64位.
我拥有Delphi XE2许可证,我找不到任何警告或提示,可以帮助我检测有效的32位结构,现在可以导致64位平台下的数据丢失.例如,对32位编译器完全有效的THandle到Cardinal赋值在编译Win64时不会引发任何警告.
当使用Delphi 2009迁移到Unicode时,我们有大量的警告帮助我们跟踪和修复可疑代码.有了XE2,我找不到任何东西.我无法想象在编译器级别上没有集成任何内容以避免我们对所有代码进行手动审查.
我错过了什么吗?如果你尝试过,你是如何将项目移植到64位的?
谢谢 !
我正在运行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
其使用条款.
环境:
据说安装了
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应用程序.
为什么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?
我有一个64位的COM DLL,我想使用heat.exe从中获取typelib信息.但是当我尝试这样做时,我得到错误193(错误的可执行格式).heat.exe只有32位,并且不能与64位可执行文件一起使用吗?我在我的机器上发现只有一个版本的heat.exe.
谢谢.