问题
我们公司生产运行Windows XP的专用设备(准确地说是Windows XPe).我们面临的一个不折不扣的法律要求是我们必须快速检测何时删除固定的 IDE驱动器.很快就会在几秒钟内完成.
有问题的驱动器是IDE驱动器.它们还具有软件保护,不受具有EWF(增强型写过滤器)层的写入的影响.EWF层位于文件系统下,保护磁盘不受写入影响.如果在受EWF保护的卷上更改或写入某些内容,则实际更改仅在内存层中发生(但文件系统不知道这一点).
问题是Windows本身似乎没有注意到固定驱动器的移除.您可以将驱动器从计算机中取出,Windows资源管理器很乐意让您浏览目录甚至打开文件(如果它们仍然在内存中缓存).由于EWF层,我甚至可以将文件写入丢失的驱动器.
我需要一个干净的纯软件解决方案.理想情况下在C#/.Net 1.1中,但我使用pinvoke或C++没有问题.
我不能做的事情
目前尴尬的解决方案
我对目前的解决方案不满意.我正在寻找更优雅,更高效的东西.
我目前正在做的涉及两个线程.
线程A轮询驱动器.它首先使用Kernel32.dll在驱动器上创建一个特殊文件:
Kernel32.CreateFile(
filename,
File_Access.GenericRead | File_Access.GenericWrite,
File_Share.Read | File_Share.Write,
IntPtr.Zero,
CreationDisposition.CreateAlways,
CreateFileFlagsAndAttributes.File_Attribute_Hidden | CreateFileFlagsAndAttributes.File_Attribute_System,
IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)
然后通过调用轮询驱动器
Kernel32.FlushFileBuffers(fileHandle);
Run Code Online (Sandbox Code Playgroud)
如果驱动器已被删除,则线程A将在返回错误代码之前挂起很长时间.
线程B轮询线程A.
如果线程B看到线程A已被锁定(暂时没有更新特殊变量),则线程B引发一个已删除驱动器的事件.
我当前的解决方案有效,但我不喜欢它.如果有人知道更清洁的软件解决方案,我将不胜感激.
我正在使用具有完整32位颜色和alpha通道的Java swt Images(org.eclipse.swt.graphics.Image).我需要提取图像的矩形作为新图像,包括完整的alpha通道信息.
例如,我的图像大小可能是100×100,我需要创建一个新图像,其左上角50×50像素与100×100图像完全相同.(我正在砍,没有重新缩放.)
我最初的尝试是创建一个我需要的空白图像(在此示例中为50×50),然后获取新图像的GC,然后在新图像上绘制旧图像的正确部分.问题是没有保持透明度.如果我的新图像开始不透明,那么绘制后的结果将完全不透明.如果我的新图像开始透明,那么绘制后的结果将是完全透明的(所有RGB颜色都是正确的,但不可见,因为所有像素的alpha都为零).
我目前的解决方案很笨重:我使用GC绘制图像,然后逐行手动复制alpha通道.
/**
* Returns a sub-rectangle from the image, preserving alpha transparency.
* @param source The image from which to copy a portion
* @param sourceData The ImageData of the source image
* @param xInSource The x-coordinate in the source image from which to start copying
* @param yInSource The y-coordinate in the source image from which to start copying
* @param widthInSource The width (in pixels) of the copied image portion
* @param heightInSource …Run Code Online (Sandbox Code Playgroud)