हम विंडोज डिफेंडर एपीआई का उपयोग कर सी # से फ़ाइल की ऑन-डिमांड स्कैन करने के लिए एक कोड लिख रहे हैं।विंडोज डिफेंडर एंटीवायरस सी # [एक्सेसवियोलेशन अपवाद] से स्कैन करें
[DllImport(@"C:\Program Files\Windows Defender\MpClient.dll")]
public static extern int WDStatus(out bool pfEnabled);
[DllImport(@"C:\Program Files\Windows Defender\MpClient.dll")]
public static extern int MpManagerOpen(uint dwReserved, out IntPtr phMpHandle);
[DllImport(@"C:\Program Files\Windows Defender\MpClient.dll")]
public static extern int MpScanStart(IntPtr hMpHandle, uint ScanType, uint dwScanOptions, IntPtr pScanResources, IntPtr pCallbackInfo, out IntPtr phScanHandle);
[DllImport(@"C:\Program Files\Windows Defender\MpClient.dll")]
public static extern int MpHandleClose(IntPtr hMpHandle);
private void DoDefenderScan_Click(object sender, EventArgs e)
{
try
{
bool pfEnabled;
int result = WDStatus(out pfEnabled); //Returns the defender status - It's working properly.
ErrorHandler.ThrowOnFailure(result, VSConstants.S_OK);
IntPtr phMpHandle;
uint dwReserved = 0;
IntPtr phScanHandle;
MpManagerOpen(dwReserved, out phMpHandle); //Opens Defender and returns the handle in phMpHandle.
tagMPRESOURCE_INFO mpResourceInfo = new tagMPRESOURCE_INFO();
mpResourceInfo.Path = "eicar.com";
mpResourceInfo.Scheme = "file";
mpResourceInfo.Class = IntPtr.Zero;
tagMPRESOURCE_INFO[] pResourceList = new tagMPRESOURCE_INFO[1];
pResourceList.SetValue(mpResourceInfo, 0);
tagMPSCAN_RESOURCES scanResource = new tagMPSCAN_RESOURCES();
scanResource.dwResourceCount = 1;
scanResource.pResourceList = pResourceList;
IntPtr resourcePointer = StructToPtr(scanResource);
result = MpScanStart(phMpHandle, 3, 0, resourcePointer, IntPtr.Zero, out phScanHandle); **//Getting Access violation exception here**.
MpHandleClose(phMpHandle);
MpHandleClose(phScanHandle);
Marshal.FreeHGlobal(resourcePointer);
}
catch (Exception)
{ }
}
और संरचना यहां परिभाषित की गई है।
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct tagMPSCAN_RESOURCES
{
public uint dwResourceCount;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
public tagMPRESOURCE_INFO[] pResourceList;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct tagMPRESOURCE_INFO
{
[MarshalAs(UnmanagedType.LPWStr)]
public String Scheme;
[MarshalAs(UnmanagedType.LPWStr)]
public String Path;
public IntPtr Class;
}
public class MPRESOURCE_CLASS
{
public uint Value;
}
private static IntPtr StructToPtr(object obj)
{
var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(obj));
Marshal.StructureToPtr(obj, ptr, false);
return ptr;
}
कोड
https://msdn.microsoft.com/en-us/library/vs/alm/dn920144(v=vs.85).aspx
पर दस्तावेज़ उपलब्ध के आधार पर लिखा है हम इस अपवाद
पढ़ने के लिए या संरक्षित स्मृति लिखने के लिए प्रयास किया गया हो रही है। यह अक्सर एक संकेत है कि अन्य स्मृति भ्रष्ट है।
result = MpScanStart(phMpHandle, 3, 0, resourcePointer, IntPtr.Zero, out phScanHandle); **//Getting Access violation exception here**.
क्या समस्या हो सकती है पर
? क्या संरचना का प्रारूप सही है?
पीएस - MPRESOURCE_CLASS के बारे में कोई जानकारी msdn में उपलब्ध नहीं है।
मुझे यकीन नहीं है कि कोड की यह पंक्ति सही है या नहीं।
mpResourceInfo.Class = IntPtr.Zero;
अद्यतन:
result = MpScanStart(phMpHandle, 1, 0, IntPtr.Zero, IntPtr.Zero, out phScanHandle);
घटना दर्शक में
डिफेंडर लॉग [अनुप्रयोगों और सेवाओं लॉग्स-माइक्रोसॉफ्ट विंडोज विंडोज:
त्वरित स्कैन इस कोड के साथ ठीक काम कर रहा है डिफेंडर/ऑपरेशनल]
विंडोज डिफेंडर स्कैन शुरू हो गया है।
स्कैन आईडी: {CDC2AC0D-7648-4313-851C-4D8B7B5EB5CD}
स्कैन प्रकार: एंटी
स्कैन पैरामीटर: त्वरित स्कैन
पवित्र हार्डकोडेड पथ, बैटमैन! कृपया यह मत करो। क्या होगा यदि मेरा बूट ड्राइव ड्राइव सी नहीं है? और क्या होगा यदि प्रोग्राम डिफेंडर में विंडोज डिफेंडर स्थापित नहीं है? –
@ कोडीग्रे - यह एक पीओसी है। लेकिन इंगित करने के लिए धन्यवाद। – mlg
मैं देखता हूं कि पहली बग MPSCAN_RESOURCES.pResourceList सदस्य घोषणा है। यह एक सरणी के लिए एक सूचक है, न कि UnmanagedType.ByValArray। आपको इसे इंटिप्टर के रूप में घोषित करना होगा और खुद को सरणी मार्शल करना होगा। पैक = 1 का उपयोग करना भी बहुत गलत है। और अधिक कीड़े हो सकती हैं, यह एक आसान एपीआई नहीं है। ऐसा करने के लिए आप C++/CLI का उपयोग करके आगे बढ़ेंगे, कम से कम आप mpclient.h शीर्षलेख फ़ाइल पर भरोसा कर सकते हैं। –