سؤال

لقد كنت أبحث منذ بعض الوقت عن طريقة لمنع المستخدم من الدخول عن طريق الخطأ إلى دليل البيانات الخاص بطلبي.

يستخدم تطبيقي مجلدًا لتخزين مشروع منظم.البنية الداخلية للمجلد مهمة ويجب عدم العبث بها.أود أن يرى المستخدم هذا المجلد ككل ولا يتمكن من فتحه (مثل حزمة Mac).

هل هناك طريقة للقيام بذلك على نظام التشغيل Windows؟

تحرير من الإجابات الحالية

بالطبع أنا لا أحاول منع المستخدمين من الوصول إلى بياناتهم، بل أحميهم فقط من تدمير سلامة البيانات عن طريق الخطأ.لذلك ليست هناك حاجة للتشفير أو الحماية بكلمة مرور.

شكرًا لكم جميعًا على إجاباتكم على .Net ولكن لسوء الحظ، هذا هو في الأساس مشروع C++ دون أي تبعية لإطار عمل .Net.

البيانات التي أذكرها ليست خفيفة، بل هي صور ملتقطة من المجهر الإلكتروني.يمكن أن تكون هذه البيانات ضخمة (حوالي 100 ميجا بايت إلى ~ 1 جيجا بايت) لذا فإن تحميل كل شيء في الذاكرة ليس خيارًا.هذه صور ضخمة لذا يجب أن يوفر التخزين طريقة لقراءة البيانات بشكل متزايد عن طريق الوصول إلى ملف واحد في كل مرة دون تحميل الأرشيف بأكمله في الذاكرة.

علاوة على ذلك، فإن التطبيق قديم بشكل أساسي مع بعض المكونات التي لسنا مسؤولين عنها.الحل الذي يسمح لي بالاحتفاظ برمز الإدخال والإخراج الحالي هو الأفضل.

يبدو امتداد Shell مثيرًا للاهتمام، وسأقوم بالتحقيق في الحل بشكل أكبر.

LarryF، هل يمكنك توضيح برنامج تشغيل عامل التصفية أو تعريف جهاز DOSDevice؟أنا لست على دراية بهذه المفاهيم.

هل كانت مفيدة؟

المحلول 9

يبدو أن بعض منافذ ويندوز من فيوز بدأت تظهر.أعتقد أن هذا سيكون الحل الأفضل لأنه سيسمح لي بالحفاظ على الكود القديم (وهو كبير جدًا) دون تغيير.

نصائح أخرى

هناك بعض الأشياء التي يمكنك القيام بها:

هناك شيء واحد وهو أنه يمكنك إنشاء FolderView Windows Shell Extension الذي من شأنه إنشاء طريقة عرض مخصصة للمجلد المهم الخاص بك.من خلال إنشاء FolderView مخصص، يمكنك جعل المجلد فارغًا باللون الأبيض مع سطر واحد من النص "لا يوجد شيء يمكن رؤيته هنا"، أو يمكنك القيام بشيء أكثر تعقيدًا مثل عارض GAC الذي يستخدم نفس الطريقة.ستكون هذه الطريقة معقدة إلى حد ما، ولكن يمكن تخفيف هذا التعقيد باستخدام شيء مثل مشروع الكود هذا مكتبة المقالات كقاعدة.

الحل الآخر هو إنشاء نظام ملفات ZIP الظاهري، وهذا يتطلب منك استبدال أي كود يستخدم System.IO مباشرة لاستخدام شيء آخر.قام ASP.NET 2.0 بذلك لهذا السبب بالتحديد ويمكنك البناء عليه بسهولة تامة، ألقِ نظرة على هذا مقالة MSDN على تنفيذ VirtualPathProvider.

التخزين المنظم تم تصميمه للسيناريو الذي تصفه:

يوفر التخزين المنظم ثبات الملفات والبيانات في COM من خلال التعامل مع ملف واحد كمجموعة منظمة من الكائنات المعروفة باسم المخازن والتدفقات.

"التخزين" يشبه المجلد، و"الدفق" يشبه الملف.في الأساس، لديك ملف واحد، عند الوصول إليه باستخدام واجهات برمجة التطبيقات للتخزين الهيكلي، يتصرف ويبدو وكأنه نظام ملفات كامل ومكتفي بذاته.

مع ذلك، لاحظ أن:

يعد الفهم القوي لتقنيات COM شرطًا أساسيًا للاستخدام التطويري للتخزين المنظم.

داخل برنامجك أم خارجه؟

هناك طرق، ولكن ليس أي منها سهلا.من المحتمل أنك ستنظر إلى برنامج تشغيل عامل التصفية على نظام الملفات.

إذا اتبعت نهج ملف ZIP (الذي فكرت فيه لك، لكنني لم أذكره) أود أن أقترح استخدام خوارزمية الانكماش، ولكن استخدم نظام الملفات الخاص بك ...انظر إلى شيء مثل تنسيق TAR.بعد ذلك، ما عليك سوى كتابة التعليمات البرمجية الخاصة بك لتمرير جميع عمليات الإدخال/الإخراج بعد خوارزميات التضخيم/الانكماش أثناء كتابتها على القرص.لن أستخدم ملف ZIP "FORMAT"، لأنه من السهل جدًا إلقاء نظرة على الملف، والعثور على PK كأول بايتين، وفك ضغط ملفك....

أنا أحب اقتراحات Joshperry أفضل.

بالطبع، يمكنك أيضًا كتابة برنامج تشغيل الجهاز الذي يقوم بتخزين جميع بياناتك داخل ملف واحد، ولكن مرة أخرى، نحن ننظر إلى برنامج التشغيل.(لست متأكدًا من إمكانية تنفيذه خارج نطاق السائق..يمكنك على الأرجح، وداخل برنامجك الاتصال بـ DefineDOSDevice، وإعطائه اسمًا لا يستطيع الوصول إليه سوى الكود الخاص بك، وسيُنظر إليه على أنه نظام ملفات عادي.).سأجرب بعض الأفكار، وإذا نجحت، سأصور لك عينة.الآن لقد أثارت اهتمامي.

يمكنك لف دليل المشروع الخاص بك في ملف .zip وتخزين بياناتك هناك، تمامًا مثلما يتم استخدام .jar (أعلم أن .jar يتم قراءته فقط، وهذا من أجل المثال).قم بإنشاء امتداد غير قياسي بحيث لا يكون للنقر المزدوج أي تأثير فوري.؛-)

بالطبع هذا يعني أنه سيتعين عليك تغليف كل ملفات الإدخال/الإخراج لاستخدام .zip بدلاً من ذلك، اعتمادًا على كيفية إنشاء برنامجك، قد يكون هذا أمرًا مملاً.لقد تم ذلك بالفعل لـ Java: TrueZip.ربما يمكنك استخدام ذلك كمصدر إلهام؟

إذا كنت قد شعرت بالإغراء - فلا أوصي بالتلاعب بأذونات المجلدات، لأن هذا لن يساعدك لأسباب واضحة.

يمكنك استخدام التخزين المعزول.

http://www.ondotnet.com/pub/a/dotnet/2003/04/21/isolatedstorage.html

إنه لا يحل جميع المشكلات، لكنه يضع بيانات التطبيق بعيدًا عن الأذى.

تذكر:إذا قمت بتخزينه في نظام الملفات، فسيتمكن المستخدم دائمًا من رؤيته.العبث بالمستكشف وأستخدم cmd.exe بدلاً من ذلك.أو القائد الشامل.او اي شيء اخر.

إذا كنت لا تريد أن يعبث الأشخاص بملفاتك، فإنني أوصي بذلك

  • تشفيرها لمنع التلاعب بالملفات
  • وضعها في الأرشيف (أيZIP)، وربما حمايته بكلمة مرور، ثم ضغطه/فك ضغطه في وقت التشغيل (أود البحث عن خوارزميات سريعة في تعديل الأرشيفات)

هذه ليست حماية كاملة بالطبع، ولكنها سهلة التنفيذ، ولا تتطلب منك تثبيت أشياء غير تقليدية داخل نظام التشغيل ويجب أن تبعد المستخدمين الأكثر فضولًا.

بالطبع، لن تتمكن أبدًا من التحكم الكامل في الملفات الموجودة على كمبيوتر المستخدم دون التحكم في الكمبيوتر نفسه.

لقد رأيت برنامجًا (Visual Paradigm's Agilian) يستخدم اقتراح Tomalak الخاص بأرشيف مضغوط باعتباره "ملف المشروع".الملفات المضغوطة مفهومة جيدًا، واستخدام امتداد الملف غير القياسي يمنع المستخدم العادي من العبث بـ "الملف".إحدى المزايا الكبيرة لذلك هي أنه في حالة الفساد، يمكن استخدام الأدوات القياسية لإصلاح المشكلة، ولا داعي للقلق بشأن إنشاء أدوات خاصة لدعم تطبيقك الرئيسي.

يسعدني سماع أنك تفعل ذلك بلغة C++.يبدو أنه لم يعد أحد يرى لغة C++ "ضرورية" بعد الآن.الأمر كله يتعلق بـ C#، وASP.NET ذلك...حتى أنني أعمل في منزل يستخدم لغة C# بالكامل، عندما أقسمت أنني سأفعل ذلك أبداً قم بالتبديل، حيث يقوم C++ بكل ما أحتاج إلى القيام به ثم بعضًا منه.أنا بالغ بما يكفي لتنظيف ذاكرتي!هيه..على كل حال نرجع للموضوع المطروح..

ال DefineDOSDevice() هي الطريقة التي تستخدمها لتعيين أحرف محركات الأقراص وأسماء المنافذ (LPT1، COM1، إلخ).تقوم بتمرير اسم له وبعض الأعلام و"المسار" الذي يتعامل مع هذا الجهاز.لكن لا تدع هذا يخدعك.إنه ليس مسار نظام الملفات، بل هو مسار كائن NT.أنا متأكد من أنك رأيتها باسم "\Device\HardDisk0"، وما إلى ذلك.يمكنك استخدام WinObj.exe من sysinternals لمعرفة ما أعنيه.على أي حال، يمكنك إنشاء برنامج تشغيل للجهاز، ثم توجيه رابط MSDOS الرمزي إليه، وستكون قيد التشغيل.لكن يبدو أن هذا يتطلب الكثير من العمل لمعرفة ماهية المشكلة الأصلية.

كم عدد ملفات meg إلى gigabyte الموجودة في دليل نموذجي؟قد يكون من الأفضل لك لصق جميع الملفات داخل ملف عملاق واحد، وتخزين ملف فهرس بجواره مباشرةً (أو رأس لكل ملف) يشير إلى "الملف" التالي داخل ملف "نظام الملفات الافتراضي" الخاص بك.

قد يكون من الأمثلة الجيدة إلقاء نظرة على تنسيق Microsoft MSN Archive.لقد قمت بعكس تنسيق الأرشيف هذا عندما كنت أعمل في شركة AV، وهو في الواقع إبداعي جدًا، ولكنه بسيط جدًا.يمكن القيام بذلك كله في ملف واحد، وإذا كنت ترغب في الحصول على مظهر فاخر، يمكنك القيام بذلك استطاع قم بتخزين البيانات عبر 3 ملفات في تكوين من نوع RAID 5، لذلك إذا تمت معالجة أي ملف من الملفات الثلاثة، فيمكنك إعادة إنشاء الملفات الأخرى.بالإضافة إلى ذلك، سيرى المستخدمون فقط 3 جداً الملفات الكبيرة في الدليل، ولن يتمكن من الوصول إلى الملفات الفردية (الداخلية).

لقد زودتك برمز يقوم بفك ضغط أحد تنسيقات أرشيف MSN هذه.ليس لدي رمز ينشئ واحدًا، ولكن من مصدر الاستخراج، ستكون قادرًا على إنشاء/كتابة واحد دون أي مشكلة.إذا تم حذف الملفات و/أو إعادة تسميتها بشكل متكرر، فقد يشكل ذلك مشكلة في المساحة المستخدمة في الملف والتي يجب قطعها من وقت لآخر.

يدعم هذا التنسيق أيضًا حقول CRC، لذا يمكنك اختبار ما إذا كنت قد حصلت على الملف بشكل جيد.لم أتمكن أبدًا من عكس الخوارزمية التي استخدمتها Microsoft لفحص البيانات بشكل كامل، ولكن لدي فكرة جيدة جدًا.

لن تكون قادرًا على الاحتفاظ بإجراءات الإدخال/الإخراج الحالية، مما يعني أن CreateFile() لن يكون قادرًا على فتح أي ملف في الأرشيف فحسب، ومع ذلك، مع روعة C++، يمكنك تجاوز استدعاء CreateFile للتنفيذ تنسيق الأرشيف الخاص بك.

إذا كنت تريد بعض المساعدة بشأنه، وهي مشكلة كبيرة بدرجة كافية، فربما يمكننا التحدث خارج الإنترنت وإيجاد حل لك.

أنا لا أعارض أن أكتب لك FileSystemDriver، ولكن لتحقيق ذلك، علينا أن نبدأ الحديث عن التعويض.سأكون سعيدًا جدًا بإعطائك التوجيهات والأفكار مجانًا، تمامًا كما أفعل الآن.

لست متأكدًا مما إذا كان من المقبول بالنسبة لي أن أعطيك عنوان بريدي الإلكتروني هنا، ولست متأكدًا من سياسات SO بشأن هذا، حيث يمكننا أن نتحدث عن العمل/التماس محتمل، ولكن هذا ليس هدفي الوحيد.أفضل أن أساعدك في العثور على الحلول الخاصة بك أولاً.

قبل أن تبحث في برنامج تشغيل الجهاز، قم بتنزيل ملف WinDDK.لديها عينات السائق في كل مكان.

إذا كنت تتساءل لماذا أهتم كثيرًا بهذا الأمر، فذلك لأنه كان عليّ لسنوات أن أكتب برنامج تشغيل مشابهًا لهذا، والذي يجب أن يكون Windows و متوافق مع OSX، مما يسمح للمستخدمين بتأمين وحدات تخزين محركات الأقراص (مفاتيح USB، وحدات التخزين القابلة للإزالة) دون تثبيت أي برامج تشغيل، أو برامج معقدة (وضخمة الحجم ومزعجة أحيانًا).في السنوات الأخيرة، قامت الكثير من الشركات المصنعة للأجهزة بأشياء مماثلة، لكنني لا أعتقد أن الأمان آمن إلى هذا الحد.إنني أتطلع إلى استخدام RSA وAES، تمامًا بنفس الطريقة التي يعمل بها GPG وPGP.تم الاتصال بي في الأصل بخصوص هذا الأمر (على ما أعتقد، ولكن ليس لدي دليل) الذي سيتم استخدامه لتأمين ملفات MP3.وبما أنه سيتم تخزينها بتنسيق مشفر، فإنها ببساطة لن تعمل بدون عبارة المرور الصحيحة.لكنني رأيت استخدامات أخرى لها أيضًا.(لقد عاد هذا عندما كانت تكلفة مفتاح USB سعة 16 ميجا (نعم MEG) تزيد عن 100 دولار أو نحو ذلك).

يتماشى هذا المشروع أيضًا مع نظام أمان الكمبيوتر الشخصي الخاص بصناعة النفط والغاز والذي يستخدم شيئًا مشابهًا للبطاقات الذكية، ولكنه أسهل بكثير في الاستخدام وإعادة الاستخدام/إعادة الإصدار، وهو مستحيل (اقرأ:من الصعب جدًا، ومن غير المرجح) اختراقه، ويمكنني استخدامه مع أطفالي في المنزل!(نظرًا لوجود صراع دائمًا حول من يحصل على الوقت الذي يقضيه على الكمبيوتر، ومن يحصل على أكبر قدر من الوقت، وما إلى ذلك، وما إلى ذلك، وما إلى ذلك، وما إلى ذلك...)

أوه..أعتقد أنني خرجت عن الموضوع هناعلى أية حال، إليك مثال لتنسيق أرشيف Microsoft MSN.تعرف على ما إذا كان بإمكانك استخدام شيء كهذا، مع العلم أنه يمكنك دائمًا "التخطي" مباشرة إلى ملف باتباع الإزاحات في الملف أثناء التحليل/البحث عن الملف المطلوب في الملف الرئيسي؛أو في البيانات التي تم تحليلها مسبقًا والمحفوظة في الذاكرة.وبما أنك لن تقوم بتحميل بيانات الملف الثنائي الخام في الذاكرة، فمن المحتمل أن يكون الحد الوحيد لديك هو حد الملف الذي يبلغ 4 جيجابايت على أجهزة 32 بت.

تم تصميم تنسيق MARC (أرشيف Microsoft MSN) (بشكل فضفاض) على النحو التالي:

  • رأس 12 بايت (واحد فقط)
    • ملف ماجيك
    • نسخة مارك
    • عدد الملفات (في الجدول التالي)
  • 68 رأسًا لجدول ملفات البايت (من 1 إلى رأس. عدد الملفات منها)
    • اسم الملف
    • حجم الملف
    • المجموع الاختباري
    • تعويض لبيانات الملف الخام

الآن، في إدخالات جدول الملفات المكونة من 12 بايت، يتم استخدام 32 بت لأطوال الملفات والإزاحات.بالنسبة لملفاتك الكبيرة جدًا، قد يتعين عليك رفع ذلك إلى أعداد صحيحة تبلغ 48 أو 64 بت.

إليك بعض التعليمات البرمجية التي كتبتها للتعامل معها.

#define MARC_FILE_MAGIC         0x4352414D // In Little Endian
#define MARC_FILENAME_LEN       56 //(You'll notice this is rather small)
#define MARC_HEADER_SIZE        12
#define MARC_FILE_ENT_SIZE      68

#define MARC_DATA_SIZE          1024 * 128 // 128k Read Buffer should be enough.

#define MARC_ERR_OK              0      // No error
#define MARC_ERR_OOD             314    // Out of data error
#define MARC_ERR_OS              315    // Error returned by the OS
#define MARC_ERR_CRC             316    // CRC error

struct marc_file_hdr
{
    ULONG            h_magic;
    ULONG            h_version;
    ULONG            h_files;
    int              h_fd;
    struct marc_dir *h_dir;
};

struct marc_file
{
    char            f_filename[MARC_FILENAME_LEN];
    long            f_filesize;
    unsigned long   f_checksum;
    long            f_offset;
};

struct marc_dir
{
    struct marc_file       *dir_file;
    ULONG                   dir_filenum;
    struct marc_dir        *dir_next;
};

وهذا يعطيك فكرة عن العناوين التي كتبتها لهم، وهذه هي الوظيفة المفتوحة.نعم، إنه يفتقد جميع مكالمات الدعم، وإجراءات الخطأ، وما إلى ذلك، ولكنك فهمت الفكرة.يرجى المعذرة عن مزيج نمط التعليمات البرمجية C وC++.كان الماسح الضوئي الخاص بنا عبارة عن مجموعة من المشكلات المختلفة مثل هذه...لقد استخدمت الاستدعاءات القديمة مثل open() و fopen() للحفاظ على المعايير مع بقية قاعدة التعليمات البرمجية.

struct marc_file_hdr *marc_open(char *filename)
{
    struct marc_file_hdr *fhdr  = (struct marc_file_hdr*)malloc(sizeof(marc_file_hdr));
    fhdr->h_dir = NULL;

#if defined(_sopen_s)
    int errno = _sopen_s(fhdr->h_fd, filename, _O_BINARY | _O_RDONLY, _SH_DENYWR, _S_IREAD | _S_IWRITE);
#else
    fhdr->h_fd = open(filename, _O_BINARY | _O_RDONLY);
#endif
    if(fhdr->h_fd < 0)
    {
        marc_close(fhdr);
        return NULL;
    }

    //Once we have the file open, read all the file headers, and populate our main headers linked list.
    if(read(fhdr->h_fd, fhdr, MARC_HEADER_SIZE) != MARC_HEADER_SIZE)
    {
        errmsg("MARC: Could not read MARC header from file %s.\n", filename);
        marc_close(fhdr);
        return NULL;
    }

    // Verify the file magic
    if(fhdr->h_magic != MARC_FILE_MAGIC)
    {
        errmsg("MARC: Incorrect file magic %x found in MARC file.", fhdr->h_magic);
        marc_close(fhdr);
        return NULL;
    }

    if(fhdr->h_files <= 0)
    {
        errmsg("MARC: No files found in archive.\n");
        marc_close(fhdr);
        return NULL;
    }

    // Get all the file headers from this archive, and link them to the main header.
    struct marc_dir *lastdir = NULL, *curdir = NULL;
    curdir = (struct marc_dir*)malloc(sizeof(marc_dir));
    fhdr->h_dir = curdir;

    for(int x = 0;x < fhdr->h_files;x++)
    {
        if(lastdir)
        {
            lastdir->dir_next = (struct marc_dir*)malloc(sizeof(marc_dir));
            lastdir->dir_next->dir_next = NULL;
            curdir = lastdir->dir_next;
        }

        curdir->dir_file = (struct marc_file*)malloc(sizeof(marc_file));
        curdir->dir_filenum = x + 1;

        if(read(fhdr->h_fd, curdir->dir_file, MARC_FILE_ENT_SIZE) != MARC_FILE_ENT_SIZE)
        {
            errmsg("MARC: Could not read file header for file %d\n", x);
            marc_close(fhdr);
            return NULL;
        }
        // LEF: Just a little extra insurance...
        curdir->dir_file->f_filename[MARC_FILENAME_LEN] = NULL;

        lastdir = curdir;
    }
    lastdir->dir_next = NULL;

    return fhdr;
}

ثم، لديك طريقة استخراج بسيطة.ضع في اعتبارك أن هذا كان مخصصًا فقط لفحص الفيروسات، لذلك لا توجد إجراءات بحث، وما إلى ذلك.تم تصميم هذا ببساطة لتفريغ الملف ومسحه ضوئيًا والمضي قدمًا.يوجد أدناه روتين رمز CRC الذي أعتقد أن Microsoft استخدمته، لكنني لست متأكدًا ماذا بالضبط أنهم CRC'ed.قد تتضمن بيانات الرأس + بيانات الملف، وما إلى ذلك.أنا فقط لم أهتم بما يكفي للعودة ومحاولة عكس ذلك.على أي حال، كما ترون، لا يوجد ضغط على تنسيق الأرشيف هذا، ولكنه كذلك جداً من السهل إضافتها.ويمكن توفير المصدر الكامل إذا كنت تريد.(أعتقد أن كل ما تبقى هو روتين الإغلاق () والرمز الذي يستدعي ويستخرج كل ملف، وما إلى ذلك!!)

bool marc_extract(struct marc_file_hdr *marc, struct marc_file *marcfile, char *file, int &err)
{
    // Create the file from marcfile, in *file's location, return any errors.
    int ofd = 0;
#if defined(_sopen_s)
     err = _sopen_s(ofd, filename, _O_CREAT | _O_SHORT_LIVED | _O_BINARY | _O_RDWR, _SH_DENYNO, _S_IREAD | _S_IWRITE);
#else
    ofd = open(file, _O_CREAT | _O_SHORT_LIVED | _O_BINARY | _O_RDWR);
#endif

    // Seek to the offset of the file to extract
    if(lseek(marc->h_fd, marcfile->f_offset, SEEK_SET) != marcfile->f_offset)
    {
        errmsg("MARC: Could not seek to offset 0x%04x for file %s.\n", marcfile->f_offset, marcfile->f_filename);
        close(ofd);
        err = MARC_ERR_OS; // Get the last error from the OS.
        return false;
    }

    unsigned char *buffer = (unsigned char*)malloc(MARC_DATA_SIZE);

    long bytesleft = marcfile->f_filesize;
    long readsize = MARC_DATA_SIZE >= marcfile->f_filesize ? marcfile->f_filesize : MARC_DATA_SIZE;
    unsigned long crc = 0;

    while(bytesleft)
    {
        if(read(marc->h_fd, buffer, readsize) != readsize)
        {
            errmsg("MARC: Failed to extract data from MARC archive.\n");
            free(buffer);
            close(ofd);
            err = MARC_ERR_OOD;
            return false;
        }

        crc = marc_checksum(buffer, readsize, crc);

        if(write(ofd, buffer, readsize) != readsize)
        {
            errmsg("MARC: Failed to write data to file.\n");
            free(buffer);
            close(ofd);
            err = MARC_ERR_OS; // Get the last error from the OS.
            return false;
        }
        bytesleft -= readsize;
        readsize = MARC_DATA_SIZE >= bytesleft ? bytesleft : MARC_DATA_SIZE;
    }

    // LEF:  I can't quite figure out how the checksum is computed, but I think it has to do with the file header, PLUS the data in the file, or it's checked on the data in the file
    //       minus any BOM's at the start...  So, we'll just rem out this code for now, but I wrote it anyways.
    //if(crc != marcfile->f_checksum)
    //{
    //    warningmsg("MARC: File CRC does not match.  File could be corrupt, or altered.  CRC=0x%08X, expected 0x%08X\n", crc, marcfile->f_checksum);
    //    err = MARC_ERR_CRC;
    //}

    free(buffer);
    close(ofd);

    return true;
}

هذا هو روتين CRC المفترض الخاص بي (ربما سرقت هذا من ستيوارت كاي و libmspack, ، لا أذكر):

static unsigned long marc_checksum(void *pv, UINT cb, unsigned long seed)
{
    int count = cb / 4;
    unsigned long csum = seed;
    BYTE *p = (BYTE*)pv;
    unsigned long ul;

    while(count-- > 0)
    {
        ul = *p++;
        ul |= (((unsigned long)(*p++)) <<  8);
        ul |= (((unsigned long)(*p++)) << 16);
        ul |= (((unsigned long)(*p++)) << 24);
        csum ^= ul;
    }

    ul = 0;
    switch(cb % 4)
    {
        case 3: ul |= (((unsigned long)(*p++)) << 16);
        case 2: ul |= (((unsigned long)(*p++)) <<  8);
        case 1: ul |= *p++;
        default: break;
    }
    csum ^= ul;

    return csum;
}                                                                                     

حسنًا، أعتقد أن هذا المنشور طويل بما يكفي الآن...اتصل بي إذا كنت بحاجة إلى مساعدة، أو لديك أسئلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top