PDA

View Full Version : بدست آوردن شماره سریال SD Card



CYCLOPS
سه شنبه 19 مرداد 1389, 11:56 صبح
سلام دوستان

من قبلا تو یه پروژه از شماره سریال فلش مموری استفاده کردم ولی حالا یکی از یوزر ها میخواست برنامه رو روی SD Card اجرا کنه که متوجه شدم سیستم بین فلش مموری و SD Card تفاوت قائل میشه و بدست آوردن شماره سریالش مثل فلش نیست . . .
خواستم اگر ممکنه در مورد بدست آوردن شماره سریال SD Card راهنماییم کنید . . .
ممنون میشم اگر دوستانی که تجربه و اطلاعی در این زمینه دارند لطف کنند و راهنماییم کنند
پیشاپیش از توجهتون ممنون :تشویق:

dr_jacky_2005
سه شنبه 19 مرداد 1389, 12:02 عصر
سلام دوستان

من قبلا تو یه پروژه از شماره سریال فلش مموری استفاده کردم ولی حالا یکی از یوزر ها میخواست برنامه رو روی SD Card اجرا کنه که متوجه شدم سیستم بین فلش مموری و SD Card تفاوت قائل میشه و بدست آوردن شماره سریالش مثل فلش نیست . . .
خواستم اگر ممکنه در مورد بدست آوردن شماره سریال SD Card راهنماییم کنید . . .
ممنون میشم اگر دوستانی که تجربه و اطلاعی در این زمینه دارند لطف کنند و راهنماییم کنند
پیشاپیش از توجهتون ممنون :تشویق:

برو اینجا
آخر صفحه:
http://forum.xda-developers.com/showthread.php?t=383884
امید وارم همین باشه.

CYCLOPS
سه شنبه 19 مرداد 1389, 12:59 عصر
دوست عزیز اون لینک در زمینه پاکت پی سی هست یعنی زمانی که SD Card به PPC یا موبایل متصل هست من منظورم به دست آوردن شماره سریال SD Card از طریق پی سی هست زمانی که از طریق رم ریدر به PC متصل هست . . .

dr_jacky_2005
سه شنبه 19 مرداد 1389, 13:49 عصر
دوست عزیز اون لینک در زمینه پاکت پی سی هست یعنی زمانی که SD Card به PPC یا موبایل متصل هست من منظورم به دست آوردن شماره سریال SD Card از طریق پی سی هست زمانی که از طریق رم ریدر به PC متصل هست . . .

یک فکر شاد به ذهنم رسید...
با این دستور سریال درایو رو میشه گرفت:

vol c:
حالا به جای درایو C
درایو این مموری رو بده.
2
نکته:
1-هر وقت که فرمت میشه،فکر کنم که سریالش عوض میشه
2-احتمالا کار کنه:لبخند:

CYCLOPS
چهارشنبه 20 مرداد 1389, 10:02 صبح
دوست عزیز ممنون ولی این دستور رو باید کجا بنویسم این اصلا سی شارپ هست ؟؟؟؟
از طرفی من گفتم سریال نامبر رو احتیاج دارم
اینی که شما گفتی Volume number هست یعنی همون طور که خودت گفتی با فرمت عوض میشه
یعنی اگر SD یوزر ویروس گرفت و خواست فرمتش کنه قفل برنامه دیگه کار نمیکنه و برنامه فکر میکنه این یه SD دیگه است

دوستان کسی نظر دیگه ای نداره ؟؟؟

81579001
چهارشنبه 20 مرداد 1389, 11:12 صبح
سلام


سلام دوستان

من قبلا تو یه پروژه از شماره سریال فلش مموری استفاده کردم

من سئوال داشتم در مورد بدست آوردن سریال فلش مموری که چطوری بدست میاد؟
تشکر

CYCLOPS
چهارشنبه 20 مرداد 1389, 13:23 عصر
سلام
من سئوال داشتم در مورد بدست آوردن سریال فلش مموری که چطوری بدست میاد؟
تشکر

سلام دوست عزیز گرچه به موضوع تاپیک مربوط نیست ولی به این لینک توجه کن . (http://social.msdn.microsoft.com/forums/en-US/Vsexpressvcs/thread/f4447ed3-7e5f-4635-a28a-afff0b620156)

مثل اینکه از دوستان (ویا حتی دشمنان) کسی اطلاعی در این مورد نداره و باید این تاپیک رو هم به لیست تاپیک های امضام اضافه کنم . . .

یــــــــــــــــا حـــــــــــــــــــــق

dr_jacky_2005
چهارشنبه 20 مرداد 1389, 14:21 عصر
دوست عزیز ممنون ولی این دستور رو باید کجا بنویسم این اصلا سی شارپ هست ؟؟؟؟
از طرفی من گفتم سریال نامبر رو احتیاج دارم
اینی که شما گفتی Volume number هست یعنی همون طور که خودت گفتی با فرمت عوض میشه
یعنی اگر SD یوزر ویروس گرفت و خواست فرمتش کنه قفل برنامه دیگه کار نمیکنه و برنامه فکر میکنه این یه SD دیگه است

دوستان کسی نظر دیگه ای نداره ؟؟؟

__
http://social.msdn.microsoft.com/forums/en-US/netfxcompact/thread/3b8c521d-a19a-423b-8e39-488d13b0e4db/


ببین اینه؟

CYCLOPS
چهارشنبه 20 مرداد 1389, 16:30 عصر
__
http://social.msdn.microsoft.com/forums/en-US/netfxcompact/thread/3b8c521d-a19a-423b-8e39-488d13b0e4db/


ببین اینه؟

دوست عزیز این لینک هم برای ویندوز موبایل هست و از توابع API ویندوز موبایل استفاده میکنند .
در واقع .NET CF هست نه .NET
در هر حال ممنون از توجهت :چشمک:

dr_jacky_2005
پنج شنبه 21 مرداد 1389, 07:51 صبح
در C# :


// 1. DECLARE NEEDED FUNCTION

[DllImport("coredll.dll")]
private static extern bool KernelIoControl(Int32 IoControlCode, IntPtr
InputBuffer, Int32 InputBufferSize, byte[] OutputBuffer, Int32
OutputBufferSize, ref Int32 BytesReturned);

// 2. SOMEWHERE, (e.g. ON BUTTON CLICK) DO THIS

byte[] OutputBuffer = new byte[256];
uint OutputBufferSize = OutputBuffer.Length;
uint bre=0;
KernelIoControl(IOCTL_DISK_GET_STORAGEID,IntPtr.Ze ro,0,OutputBuffer,OutputBufferSize,ref
BytesReturned);

// 3. DO SOMETHING WITH OutputBuffer

funny part : I don't have evc++4.0, so if someone can send me/followup VALUE
of IOCTL_DISK_GET_STORAGEID (or heder file containing same), thanks


در C/C++:


HEADER FILE
#ifndef _FLASHCARD_H
#define _FLASHCARD_H

class CFlashCard
{
public:
enum { MAX_CARD_PATH = 128 };

static BOOL isCardAvailable();
static BOOL getSerialNumber(TCHAR* buf, UINT bufLength);

static TCHAR* getCardPath() { return m_CardPath; }

protected:
static TCHAR m_CardPath[MAX_CARD_PATH];
};

#endif

CPP FILE
#include "stdafx.h"
#include "FlashCard.h"
#include <projects.h>
#include <winioctl.h>

// Include library Note_Prj.lib
#pragma comment (lib, "Note_Prj.lib")

//------------------------------------------------------------------------------
//
// Static data members
//
//------------------------------------------------------------------------------
TCHAR CFlashCard::m_CardPath[CFlashCard::MAX_CARD_PATH];

// The list of known on-board storage names
static const TCHAR* STORAGE[] =
{
_T("iPAQ File Store"),
_T("Built-in Storage")
};
static const ULONG STORAGE_COUNT = sizeof(STORAGE) / sizeof(TCHAR*);

//------------------------------------------------------------------------------
//
// Used to see if a flash card is inserted into a socket. Return true
if card
// is found, false otherwise. Also, if found, sets card's path
//
//------------------------------------------------------------------------------
BOOL CFlashCard::isCardAvailable()
{
BOOL res = TRUE;
HANDLE hFlashCard = NULL;
WIN32_FIND_DATA find;
BOOL loop = TRUE;
BOOL found = FALSE;
UINT flashCardCount = 0;

// Look for the SD card.
memset(&find, 0, sizeof(WIN32_FIND_DATA));

hFlashCard = ::FindFirstFlashCard(&find);

if(INVALID_HANDLE_VALUE != hFlashCard)
{
// We must enumerate the flash cards, since the dumb
// iPAQ file store is defined as a flash card
while(loop)
{
// Only look at the flash card if it is a directory and temporary
if(((find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ==
FILE_ATTRIBUTE_DIRECTORY) &&
((find.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) ==
FILE_ATTRIBUTE_TEMPORARY))
{
found = FALSE;

for(ULONG i=0; i<STORAGE_COUNT; i++)
{
if(_tcscmp(find.cFileName, STORAGE[i]) == 0)
{
found = TRUE;
}
}

// Only count the card if it is the correct size
if(found == FALSE)
{
// Save the name of the flash card
_tcsncpy(m_CardPath, find.cFileName, MAX_CARD_PATH);
flashCardCount++;
}
}

// Next flash card
loop = ::FindNextFlashCard(hFlashCard, &find);
}

::FindClose (hFlashCard);

// If no flash cards were found in the enumeration, then leave
if(flashCardCount == 0)
{
res = FALSE;
}
}
else
{
// No flash cards found
_stprintf(m_CardPath, _T("ERR: %d"), ::GetLastError());
res = FALSE;
}

return res;
}

//------------------------------------------------------------------------------
//
// Get the flash card serial number and save in passed in buffer.
//
//------------------------------------------------------------------------------
BOOL CFlashCard::getSerialNumber(TCHAR* buf, UINT bufLength)
{
// These values are only defined in Platform Builder, so we have to
// redefine them here
#define IOCTL_DISK_BASE FILE_DEVICE_DISK
#define IOCTL_DISK_GET_STORAGEID CTL_CODE(IOCTL_DISK_BASE, 0x709, \
METHOD_BUFFERED, FILE_ANY_ACCESS)
#define MANUFACTUREID_INVALID 0x01
#define SERIALNUM_INVALID 0x02

// This structure is only defined in Platform Builder, so we have to
// redefine it here
typedef struct _STORAGE_IDENTIFICATION
{
DWORD dwSize;
DWORD dwFlags;
DWORD dwManufactureIDOffest;
DWORD dwSerialNumOffset;
} STORAGE_IDENTIFICATION, *PSTORAGE_IDENTIFICATION;

const UINT BBUF_LENGTH = 256;
const UINT STR_LENGTH = 256;
const UINT SERIAL_NUMBER_LENGTH = 8;
BOOL res = TRUE;
byte bbuf[BBUF_LENGTH];
TCHAR str[STR_LENGTH];
STORAGE_IDENTIFICATION* si;
HANDLE hCard = NULL;
ULONG dwNumReturned = 0;
ULONG err = 0;

// Make sure a card is inserted and found before attempting to read
// the serial number
if(isCardAvailable() == TRUE)
{
// Clear the buffer
memset(bbuf, 0, BBUF_LENGTH);

// Clear the buffer
memset(buf, 0, bufLength * sizeof(TCHAR));

// Set a STORAGE_IDENTIFICATION pointer to the buffer (overlaying the
structure)
si = (STORAGE_IDENTIFICATION*)bbuf;

// Create the volume name of the flash card
_stprintf(str, _T("\\%s\\Vol:"), m_CardPath);

// Get a handle to the flash card (drive) volume
hCard = ::CreateFile(str, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

// Set the size element of the STORAGE_IDENTIFICATION structure
si->dwSize = BBUF_LENGTH;

// Fill the STORAGE_IDENTIFICATION structure with the flash card info
if(: DeviceIoControl(hCard, IOCTL_DISK_GET_STORAGEID, (LPVOID)NULL, 0,
si, BBUF_LENGTH, &dwNumReturned, NULL) == FALSE)
{
err = ::GetLastError();
res = FALSE;
}

// Close the handle
::CloseHandle (hCard);

// See if the serial number is valid. If not, return false, otherwise
get
// the serial number
if((si->dwFlags & SERIALNUM_INVALID) != SERIALNUM_INVALID)
{
// Get a char pointer to the serial number in the byte array
CHAR* sn = (CHAR*)((UINT)si + si->dwSerialNumOffset);

// Covert the CHAR serial number to a TCHAR string
mbstowcs(buf, sn, SERIAL_NUMBER_LENGTH);
buf[SERIAL_NUMBER_LENGTH] = 0;
}
else
{
// Serial number is not available
_tcscpy(buf, _T("! NONE !"));
res = FALSE;
}
}
else
{
// No card
_tcscpy(buf, _T("NO CARD"));
res = FALSE;
}

return res;
}

CYCLOPS
جمعه 22 مرداد 1389, 09:06 صبح
دوست عزیز این کدها رو دیدم اما همونطور که گفتم اینها کدهای .NET CF هست نه .NET و روی ویندوز موبایل کار میکنه نه PC
در هر صورت ممنون از توجهت
بقیه دوستان نظری ندارند ؟؟؟؟

dr_jacky_2005
شنبه 23 مرداد 1389, 07:38 صبح
دوست عزیز این کدها رو دیدم اما همونطور که گفتم اینها کدهای .NET CF هست نه .NET و روی ویندوز موبایل کار میکنه نه PC
در هر صورت ممنون از توجهت
بقیه دوستان نظری ندارند ؟؟؟؟


100% :

http://jo0ls-dotnet-stuff.blogspot.com/2008/12/read-secure-digital-sd-card-serial.html

فقط اگه بعد از فهمیدنت
یه تیکه برنامۀ کوچیکم بزاری همه استفاده کنیم.
(امید وارم اینبار دیگه نگی واسه .NET CF :خجالت: )