Articles of pipe理员

Windows 32位虚拟内存页面映射问题

我从这里学习了Windows 32位虚拟内存页面映射, (我的目标是现代Windows版本,如Vista,Win 7,Server 2003/2008 32位版本。) http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx 两个混乱, 用户空间的虚拟内存空间通常限制在2G,但是物理磁盘页面的存储量可能比2G大得多。 由于磁盘页面比虚拟内存页面多,因此理论上可以将多个磁盘页面映射到一个虚拟地址页面。 如果用户请求访问某个虚拟地址,如果多个磁盘页面映射到一个虚拟地址页面,内存pipe理器如何知道应该访问哪个磁盘页面? 不知道为什么有像byte []这样的数组必须使用连续的虚拟内存空间。 我想理论上即使我们只分配了500M的虚拟空间地址,我们也可以重新使用这样的虚拟空间地址来继续映射/取消映射磁盘页面文件,尽可能多的使用我们想要的,甚至大于2G。 有任何想法吗?

从以admin身份运行的进程中以用户身份启动进程

我想从一个以pipe理员身份运行的程序启动另一个以用户身份运行的程序。 问题是第二个程序需要使用outlook,如果程序以admin身份运行,这是不可能的。 主程序需要以pipe理员身份运行。 我已经想出了这两个解决scheme: Process.Start("cmd.exe", @"/C runas.exe /savecred /user:" + Environment.UserDomainName + "\\" + Environment.UserName + " " + "\"SomeProgram.exe" + "\""); 要么 Process.Start("explorer.exe", "SomeProgram.exe"); 但是我对这两个解决scheme都有问题。 第一个要求用户input密码(仅在Windows重新启动后第一次)。 第二个probalby未来不会工作,因为据我所知,它被认为是一个bug,并可能在未来更新。 所以我想知道有没有其他解决scheme,用户不需要input密码? 这似乎为我工作: Process.Start("cmd.exe", @"/C runas.exe /TrustLevel:0x20000 " + "\"SomeProgram.exe" + "\"");

Vista堆怎么回事?

我试图更好地理解为什么Windows Vista堆的行为方式。 考虑以下非常简单的程序: #include <vector> #define NUM_ALLOCS 10000000 int _tmain(int argc, _TCHAR* argv[]) { for (int iteration=0; iteration<10000; ++iteration) { std::vector<unsigned char *> buffer; buffer.reserve(NUM_ALLOCS); for (int i=0;i<NUM_ALLOCS;++i) { buffer.push_back(new unsigned char); } for (int i=0;i<NUM_ALLOCS;++i) { delete buffer[i]; } } return 0; } 基本上这是一个循环,每次迭代分配大量的1字节块,然后释放它们。 自然,这个程序的内存使用量会随着缓冲区的分配而上升,然后在释放缓冲区时会closures。 我在Windows Vista 64-bit上看到的行为是,峰值内存使用量(如任务pipe理器或vmmap报告的)随着时间的推移保持大致恒定,而报告的最低内存使用量增长,直到接近峰值内存使用量。 在Windows 7 64位上报告的最低内存使用量不会随着时间而增长。 编辑:我已经testing了两台配备8 GB / […]

如何在没有pipe理员权限的情况下从具有pipe理员权限的进程启动新进程?

我正在为应用程序创build一个自动更新程序。 该应用程序由用户启动,并且在没有pipe理员权限的情况下运行。 autoupdater以pipe理员权限启动,在下载新文件之前终止应用程序。 当我想在autoupdater完成后启动更新的应用程序时,问题出现了。 如果我使用常规System.Diagnostics.Process.Start(文件),则应用程序也以pipe理员权限启动,并且必须在当前用户上运行才能按预期工作。 那么,如何让autoupdater作为当前用户而不是pipe理员启动应用程序? 我曾尝试使用以下内容: var pSI = new ProcessStartInfo() { UseShellExecute = false, UserName = Environment.UserName, FileName = file }; System.Diagnostics.Process.Start(pSI); 但是这会引发错误“无效的用户名或密码”。 我检查了用户名是正确的,我知道密码可能是无效的,因为我没有包括它。 但是要求用户input他/她的密码不是一个select,因为自动启动应用程序的全部原因是为了使用户更容易。 有什么build议么?

如何创build一个虚拟文件?

我想模拟一个文件,而不写在磁盘上。 我有一个文件在我的可执行文件的末尾,我想给它的path一个DLL。 当然,因为它没有一个真正的path,我不得不伪造它。 我第一次尝试在Windows下使用命名pipe道来做到这一点。 这将允许像\\。\pipe\ mymemoryfile的path,但我不能让它的工作,我不知道该DLL会支持这样的path。 其次,我发现CreateFileMapping和GetMappedFileName。 他们可以用来模拟另一个片段中的文件吗? 我不确定这是什么这个API。 我想要做的似乎与boxedapp类似。 有关他们如何做的任何想法? 我想这是像API截取(像绕道),但这将是很多工作。 还有另一种方法吗? 为什么? 我对这个特定的解决scheme很感兴趣,因为我想隐藏这些数据,而且只是为了分发一个文件,但也是为了让这种方式成为可能);我同意将数据复制到一个临时文件是可行的并成为一个更容易的解决scheme。

C ++ Windows Asynch IO命名pipe道第一条消息没有收到

使用重叠I / O从命名pipe道服务器修改代码https://msdn.microsoft.com/en-us/library/windows/desktop/aa365603(v=vs.85).aspx 服务器代码如下所示: #include <windows.h> #include <stdio.h> #include <tchar.h> #include <strsafe.h> #include <iostream> #define CONNECTING_STATE 0 #define READING_STATE 1 #define INSTANCES 4 #define PIPE_TIMEOUT 5000 #define BUFSIZE 4096 typedef struct { OVERLAPPED oOverlap; HANDLE hPipeInst; TCHAR chRequest[BUFSIZE]; DWORD cbRead; TCHAR chReply[BUFSIZE]; DWORD cbToWrite; DWORD dwState; BOOL fPendingIO; } PIPEINST, *LPPIPEINST; BOOL ConnectToNewClient(HANDLE, LPOVERLAPPED); PIPEINST […]

在32位XP上分配超过1 GB的内存

我碰到一个奇怪的问题,我的进程不能分配比似乎略低于1 GiB的东西。 Windows任务pipe理器“Mem Usage”栏会显示接近1 GiB的值,当我的软件给出bad_allocexception时。 是的,我检查了传递给内存分配的值是合理的。 (没有竞争条件/腐败存在,会导致失败)。 是的,我需要所有这些记忆,而且没有办法。 (这是图像的缓冲区,无法进一步压缩) 我不想一次性分配整个1 GiB内存,每个分配大约300 MiB。 这会造成问题吗? (我会试着看看是否让更小的分配工作更好)。 是否有一些编译器开关或其他我必须设置为了通过1 GiB? 我见过其他人抱怨2 GiB限制,这对我来说很好..我只需要一点点:)。 我正在使用VS 2005与SP1,我正在运行它在一个32位的XP和它在C + +。

在Windows中更改文件所有者

Windows中是否有类似于Linux的chown的API?

用C ++代码中的Windows本机程序打开文件

我的C + +程序创build.png文件,我需要创build后立即打开(查看)该文件 – 有没有办法打开它,因为它是在Windows资源pipe理器中打开 – 所以文件将用用户首选的程序打开,如果有没有与文件格式相关联的程序 – Windows将显示对话窗口,用户将能够select任何程序来打开该文件。 跨平台(+ Linux,+ MacOS,+ BSD)解决scheme将是完美的。 谢谢。

分配更多的内存比使用malloc存在

这个代码片段每次从stdin中读取字母“u”时将分配2Gb,并在读取“a”时初始化所有分配的字符。 #include <iostream> #include <stdlib.h> #include <stdio.h> #include <vector> #define bytes 2147483648 using namespace std; int main() { char input [1]; vector<char *> activate; while(input[0] != 'q') { gets (input); if(input[0] == 'u') { char *m = (char*)malloc(bytes); if(m == NULL) cout << "cant allocate mem" << endl; else cout << "ok" << endl; activate.push_back(m); […]